Angular2+ and ASP.NET WebAPI on IIS

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 14 Jan 2019 21:28

Если кто делал - расскажите как вы это все сетапнули.

Имеется Angular апп - это понятно, статический сайт, захостить где угодно можно.
Также имеется WebAPI REST API который нужен ангуляру. Тоже понятно как это захостить под IIS

Но появляется такой зверь как CORS и я этого пережить не могу :) Ну т.е. настроить чтоб работало нет вопросов но то что эта хрень присутствует меня не устраивает. Дополнительные round-trips это ужос.
Поэтому и хочу хостить так чтобы под одним доменом все работало без всяких CORS. Но и хочется чтоб деплоймент был красивым а не смесь .NET/Angular файлов в одной папке.

Если кто такое сделал - поделитесь какие настройки IIS и т.д. использовались..
Лучше водки — хуже нет! ©

User avatar
KVA
Уже с Приветом
Posts: 5015
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by KVA » 16 Jan 2019 04:27

За CORS я ничего не могу сказать, но какая разница как оно там лежит на сервере не понятно. Дефолтный Angular + . Net проект деплоется вполне красиво одной кнопкой что из VS что например через Teamcity.

User avatar
VovaK98
Уже с Приветом
Posts: 1518
Joined: 04 Mar 2002 10:01
Location: Tampa

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by VovaK98 » 16 Jan 2019 14:50

Мне кажется, если еще не ответили по сути, то вряд-ли кто-то ответит. Здесь сидят либо угрюмые сисадмины, либо полированные программисты-писатели, для которых deployment это что-то вне их зоны комфорта. Деплоймент одной кнопкой, ага.. :wink:

Был бы тут Стенкин, он бы вообще сказал, что iis это фу. Но богу богово, как говорится.

Я сам плотно сижу в AngularJS и .net, про CORS (в контексте AWS) в курсе, но у меня свои заморочки, в которых нет Angular 2+.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 16 Jan 2019 17:22

Мне уже ответили на стеке, все можно сделать как надо, но пока не пробовал:

Code: Select all

You can host both Frontend and API under one domain in IIS but stored in different folders. Example :
•The root app (frontend), with physical path on C:\inetpub\front and URL rewrite according to Angular needs. One thing to add is REQUEST_URI does not match ^/api/ with your API hosted on the path /api
•A Virtual Path inside your first one, with a virtual path on /api and physical path on C:\inetpub\api.

Both would have their own web.config, even separate application pool.
More information about virtual directories : https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis
Лучше водки — хуже нет! ©

User avatar
VovaK98
Уже с Приветом
Posts: 1518
Joined: 04 Mar 2002 10:01
Location: Tampa

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by VovaK98 » 17 Jan 2019 00:53

katit wrote:
16 Jan 2019 17:22
Мне уже ответили на стеке, все можно сделать как надо, но пока не пробовал:
..
То что они тебе прислали - больше похоже на generic ответ, типа как сконфигурить web application under website. Это в принципе всегда можно было, уже с IIS7 (Windows server 2008?), если не раньше, с 2003го сервера.
Не вижу необходимости в отдельном app pool для web application. Ну, если нужно только сделать отдельный security context/user, тогда да.
Помнится, ещё site/root web.config takes precedence over app web.config.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 17 Jan 2019 01:01

VovaK98 wrote:
17 Jan 2019 00:53
katit wrote:
16 Jan 2019 17:22
Мне уже ответили на стеке, все можно сделать как надо, но пока не пробовал:
..
То что они тебе прислали - больше похоже на generic ответ, типа как сконфигурить web application under website. Это в принципе всегда можно было, уже с IIS7 (Windows server 2008?), если не раньше, с 2003го сервера.
Не вижу необходимости в отдельном app pool для web application. Ну, если нужно только сделать отдельный security context/user, тогда да.
Помнится, ещё site/root web.config takes precedence over app web.config.
Нет, все верно. Я хотел XCOPY deployment, таким образом я его получу. Будет один сайт с virtual directory внутрях. Раздельные конфиги. Ну и pools впридачу, почему бы и нет. Хотя бы из интереса чтобы видеть какой сколько ресурсов берет.
Лучше водки — хуже нет! ©

User avatar
VovaK98
Уже с Приветом
Posts: 1518
Joined: 04 Mar 2002 10:01
Location: Tampa

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by VovaK98 » 17 Jan 2019 01:22

katit wrote:
17 Jan 2019 01:01
Нет, все верно. Я хотел XCOPY deployment, таким образом я его получу. Будет один сайт с virtual directory внутрях. Раздельные конфиги. Ну и pools впридачу, почему бы и нет. Хотя бы из интереса чтобы видеть какой сколько ресурсов берет.
Всё логично.

Для примера у меня есть Helpdesk сайт. Для простоты назовем его helpdesk.com. Тогда:
helpdesk.com (типа root) - public доступ для кастомеров, c главным web.config,
helpdesk.com/api - тоже как бы public для кастомеров, но уже для мобилок и Outlook add-ins, где свой web.config, и по умолчанию тот же app pool,
helpdesk.com/internal - secure доступ для IT/employees - это уже secured web application, со своим authorization, лучше с другим app pool.

Плюсы:
- CORS если нужно делать - проблем нет, так как все видится как один сайт,
- SSL сертификат - один дешёвый - опять же, потому что всё один сайт.

Минусы:
- если вдруг misconfigured main web.config, то это affect все web applications,
- если надо bring down public site for maintenance, то всё внутри тоже лежит,
- если изменить root website security, то это опять affect все applications.

Если же делать с подсайтами типа: helpdesk.com, api.helpdesk.com, secure.helpdesk.com,
то CORS уже как бы не работает, ну и сертификат нужно подороже покупать. (Слава богу, IIS8 поддерживает multiple SSLs per server, и wildcard уже не нужно. :good: )
В такой конфигурации главный плюс - deployment/maintenance одного сайта не затрагивает другие вообще.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.

User avatar
KVA
Уже с Приветом
Posts: 5015
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by KVA » 17 Jan 2019 14:01

VovaK98 wrote:
16 Jan 2019 14:50

Деплоймент одной кнопкой, ага.. :wink:
А что ага то? Такое впечатление что вы утверждаете что такого не бывает. Также впечатление что у вас деплоймет ручками происходит. Набрали типа xcopy в командной строке и та-да.

Не можете пояснить?

User avatar
VovaK98
Уже с Приветом
Posts: 1518
Joined: 04 Mar 2002 10:01
Location: Tampa

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by VovaK98 » 17 Jan 2019 15:07

KVA wrote:
17 Jan 2019 14:01
А что ага то? Такое впечатление что вы утверждаете что такого не бывает. Также впечатление что у вас деплоймет ручками происходит. Набрали типа xcopy в командной строке и та-да.
Не можете пояснить?
Я к тому, что прежде чем эта кнопка заработает, надо чтобы сначала её для вас кто-нибудь настроил. И не факт, что её настроили правильно, что не осталось дырок в виде открытых портов на production серверах, неотключенной incoming NTLM, итп.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 17 Jan 2019 16:19

VovaK98 wrote:
17 Jan 2019 01:22

Минусы:
- если вдруг misconfigured main web.config, то это affect все web applications,
Разве? А если virtual directory имеет свой web.config, он ведь не будет также подхватывать основной?
Лучше водки — хуже нет! ©

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 17 Jan 2019 16:20

KVA wrote:
17 Jan 2019 14:01
VovaK98 wrote:
16 Jan 2019 14:50

Деплоймент одной кнопкой, ага.. :wink:
А что ага то? Такое впечатление что вы утверждаете что такого не бывает. Также впечатление что у вас деплоймет ручками происходит. Набрали типа xcopy в командной строке и та-да.

Не можете пояснить?
Конкретно в моем случае XCOPY это не буквально комманда. Это просто значит что во время деплоймента мы руками пишем новые файлы в директорию. Занимает все 5 минут.
Лучше водки — хуже нет! ©

SergP
Уже с Приветом
Posts: 129
Joined: 13 Apr 2000 09:01
Location: Ames, IA

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by SergP » 17 Jan 2019 17:01

katit wrote:
17 Jan 2019 16:19
VovaK98 wrote:
17 Jan 2019 01:22

Минусы:
- если вдруг misconfigured main web.config, то это affect все web applications,
Разве? А если virtual directory имеет свой web.config, он ведь не будет также подхватывать основной?
Virtual directory web.config работает как добавка к основному web.config.

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 17 Jan 2019 17:08

SergP wrote:
17 Jan 2019 17:01
katit wrote:
17 Jan 2019 16:19
VovaK98 wrote:
17 Jan 2019 01:22

Минусы:
- если вдруг misconfigured main web.config, то это affect все web applications,
Разве? А если virtual directory имеет свой web.config, он ведь не будет также подхватывать основной?
Virtual directory web.config работает как добавка к основному web.config.
Shit. Блин. Надо дальше думать значит.
Лучше водки — хуже нет! ©

User avatar
KVA
Уже с Приветом
Posts: 5015
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by KVA » 17 Jan 2019 19:23

katit wrote:
17 Jan 2019 16:20
Конкретно в моем случае XCOPY это не буквально комманда. Это просто значит что во время деплоймента мы руками пишем новые файлы в директорию. Занимает все 5 минут.
Девелоперы деплоят руками? Ох ...

User avatar
katit
Уже с Приветом
Posts: 22227
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by katit » 17 Jan 2019 19:27

KVA wrote:
17 Jan 2019 19:23
katit wrote:
17 Jan 2019 16:20
Конкретно в моем случае XCOPY это не буквально комманда. Это просто значит что во время деплоймента мы руками пишем новые файлы в директорию. Занимает все 5 минут.
Девелоперы деплоят руками? Ох ...
Нет конечно, у нас в компании из 10 человек есть DevOps департмент, один человек пушит в staging, второй в production. И все secured. Ох...
Лучше водки — хуже нет! ©

6AM
Posts: 19
Joined: 13 Mar 2019 14:57

Re: Angular2+ and ASP.NET WebAPI on IIS

Post by 6AM » 15 Mar 2019 01:57

Вообще-то не так сложно это сделать - вот например :

IIS server folder structure:
C:\inetpub\web.site.com - IIS website folder
C:\inetpub\web.site.com\OData - folder for rest api project (.NET 4.6.x EF ASP.NET OData)
C:\inetpub\web.site.com\web.config

Build your Angular project using ex "ng build --prod --aot" and copy \dist content to the C:\inetpub\web.site.com\

Important: \dist\assets (if you have one) should be copied to C:\inetpub\web.site.com\assets

Example of C:\inetpub\web.site.com\web.config below:

Нужно будет установить https://www.iis.net/downloads/microsoft/url-rewrite

--- Azure instance --- IIS 10.x --- web.config ---
<configuration>
<system.webServer>

<rewrite>
<rules>
<rule name="OData" stopProcessing="true">
<match url="OData" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="None" />
</rule>
<rule name="Angular Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>


<httpCompression staticCompressionIgnoreHitFrequency="true" staticCompressionEnableCpuUsage="90">
<dynamicTypes>
<add mimeType="application/json" enabled="true" />
</dynamicTypes>
</httpCompression>

</system.webServer>
</configuration>
--- end ---

Твой сайт будет виден как https:\\web.site.com а rest api https:\\web.site.com\OData и т.к. они сидят на одном домене Angulаr HttpClient не будет генерировать CORS HTTP запросы совсем.

Если CORS напрягают и нет желания это отдельно конфигурировать в .config то можно это прибить гвоздями прямо в самом проекте прописав Application_BeginRequest в Global.asax.cs
Обрати внимание на Access-Control-Max-Age - этот параметер предотвращяет повторные CORS запросы.

--- Global.asax.cs ---
protected void Application_BeginRequest(object sender, EventArgs e)
{
EnableCrossDomain();
}

// Below was updated to only inserd hearder when OPTIONS found:
// https://www.devexpress.com/Support/Cent ... pplication
// https://www.codeproject.com/Articles/84 ... ORS-in-WCF

// <summary>
/// Enables cross domain POST, MERGE, DELETE for Firefox and Chrome
/// This requires:
/// <system.ServiceModel>
/// <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
/// </summary>
static void EnableCrossDomain()
{
try
{
/* Logging
if (WebApiConfig.LogHeaders)
logger.Log(DEBUG, "EnableCrossDomain {0} {1}: \n{2}",
HttpContext.Current.Request.HttpMethod,
HttpContext.Current.Request.RawUrl,
String.Join(",", HttpContext.Current.Request.Headers.AllKeys));
*/

// https://stackoverflow.com/questions/471 ... cors-issue
// https://developer.mozilla.org/en-US/doc ... se-Headers
HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "*,Authorization,Content-Length,MYHEADER-X,MYHEADER-Y,MYHEADER-Z");

if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
string method = HttpContext.Current.Request.Headers["Access-Control-Request-Method"];
if (!string.IsNullOrEmpty(method))
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", method);

string headers = HttpContext.Current.Request.Headers["Access-Control-Request-Headers"];
if (!string.IsNullOrEmpty(headers))
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", headers);

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");

HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");

HttpContext.Current.Response.StatusCode = 204;
HttpContext.Current.Response.End();
}
}
catch (Exception ex)
{
//logger.Log(FATAL, ex);
}
}
}
--- end ---

Return to “Вопросы и новости IT”