Angular2+ and ASP.NET WebAPI on IIS
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Angular2+ and ASP.NET WebAPI on IIS
Если кто делал - расскажите как вы это все сетапнули.
Имеется Angular апп - это понятно, статический сайт, захостить где угодно можно.
Также имеется WebAPI REST API который нужен ангуляру. Тоже понятно как это захостить под IIS
Но появляется такой зверь как CORS и я этого пережить не могу Ну т.е. настроить чтоб работало нет вопросов но то что эта хрень присутствует меня не устраивает. Дополнительные round-trips это ужос.
Поэтому и хочу хостить так чтобы под одним доменом все работало без всяких CORS. Но и хочется чтоб деплоймент был красивым а не смесь .NET/Angular файлов в одной папке.
Если кто такое сделал - поделитесь какие настройки IIS и т.д. использовались..
Имеется Angular апп - это понятно, статический сайт, захостить где угодно можно.
Также имеется WebAPI REST API который нужен ангуляру. Тоже понятно как это захостить под IIS
Но появляется такой зверь как CORS и я этого пережить не могу Ну т.е. настроить чтоб работало нет вопросов но то что эта хрень присутствует меня не устраивает. Дополнительные round-trips это ужос.
Поэтому и хочу хостить так чтобы под одним доменом все работало без всяких CORS. Но и хочется чтоб деплоймент был красивым а не смесь .NET/Angular файлов в одной папке.
Если кто такое сделал - поделитесь какие настройки IIS и т.д. использовались..
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
Re: Angular2+ and ASP.NET WebAPI on IIS
За CORS я ничего не могу сказать, но какая разница как оно там лежит на сервере не понятно. Дефолтный Angular + . Net проект деплоется вполне красиво одной кнопкой что из VS что например через Teamcity.
-
- Уже с Приветом
- Posts: 1830
- Joined: 04 Mar 2002 10:01
- Location: Tampa
Re: Angular2+ and ASP.NET WebAPI on IIS
Мне кажется, если еще не ответили по сути, то вряд-ли кто-то ответит. Здесь сидят либо угрюмые сисадмины, либо полированные программисты-писатели, для которых deployment это что-то вне их зоны комфорта. Деплоймент одной кнопкой, ага..
Был бы тут Стенкин, он бы вообще сказал, что iis это фу. Но богу богово, как говорится.
Я сам плотно сижу в AngularJS и .net, про CORS (в контексте AWS) в курсе, но у меня свои заморочки, в которых нет Angular 2+.
Был бы тут Стенкин, он бы вообще сказал, что iis это фу. Но богу богово, как говорится.
Я сам плотно сижу в AngularJS и .net, про CORS (в контексте AWS) в курсе, но у меня свои заморочки, в которых нет Angular 2+.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Re: Angular2+ and ASP.NET WebAPI on IIS
Мне уже ответили на стеке, все можно сделать как надо, но пока не пробовал:
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
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 1830
- Joined: 04 Mar 2002 10:01
- Location: Tampa
Re: Angular2+ and ASP.NET WebAPI on IIS
То что они тебе прислали - больше похоже на 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.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Re: Angular2+ and ASP.NET WebAPI on IIS
Нет, все верно. Я хотел XCOPY deployment, таким образом я его получу. Будет один сайт с virtual directory внутрях. Раздельные конфиги. Ну и pools впридачу, почему бы и нет. Хотя бы из интереса чтобы видеть какой сколько ресурсов берет.VovaK98 wrote: ↑17 Jan 2019 00:53То что они тебе прислали - больше похоже на 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.
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 1830
- Joined: 04 Mar 2002 10:01
- Location: Tampa
Re: Angular2+ and ASP.NET WebAPI on IIS
Всё логично.
Для примера у меня есть 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 уже не нужно. )
В такой конфигурации главный плюс - deployment/maintenance одного сайта не затрагивает другие вообще.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
-
- Уже с Приветом
- Posts: 1830
- Joined: 04 Mar 2002 10:01
- Location: Tampa
Re: Angular2+ and ASP.NET WebAPI on IIS
Я к тому, что прежде чем эта кнопка заработает, надо чтобы сначала её для вас кто-нибудь настроил. И не факт, что её настроили правильно, что не осталось дырок в виде открытых портов на production серверах, неотключенной incoming NTLM, итп.
Несите чушь бережно, стараясь не расплескать. Чушь хороша, когда она полная.
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Re: Angular2+ and ASP.NET WebAPI on IIS
Разве? А если virtual directory имеет свой web.config, он ведь не будет также подхватывать основной?
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Re: Angular2+ and ASP.NET WebAPI on IIS
Конкретно в моем случае XCOPY это не буквально комманда. Это просто значит что во время деплоймента мы руками пишем новые файлы в директорию. Занимает все 5 минут.
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 147
- Joined: 13 Apr 2000 09:01
Re: Angular2+ and ASP.NET WebAPI on IIS
Virtual directory web.config работает как добавка к основному web.config.
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Re: Angular2+ and ASP.NET WebAPI on IIS
Shit. Блин. Надо дальше думать значит.
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Re: Angular2+ and ASP.NET WebAPI on IIS
Нет конечно, у нас в компании из 10 человек есть DevOps департмент, один человек пушит в staging, второй в production. И все secured. Ох...
Лучше водки — хуже нет! ©
-
- Уже с Приветом
- Posts: 602
- Joined: 13 Mar 2019 14:57
Re: Angular2+ and ASP.NET WebAPI on IIS
Вообще-то не так сложно это сделать - вот например :
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 ---
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 ---