// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/error/500"); app.UseHsts(); } // Do not write telemetry to debug output TelemetryDebugWriter.IsTracingDisabled = true; app.UseResponseCaching(); app.UseResponseCompression(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseAuthentication(); // WorkContextBuildMiddleware must always be registered first in the Middleware chain app.UseMiddleware <WorkContextBuildMiddleware>(); app.UseMiddleware <StoreMaintenanceMiddleware>(); app.UseMiddleware <NoLiquidThemeMiddleware>(); app.UseMiddleware <CreateStorefrontRolesMiddleware>(); app.UseMiddleware <ApiErrorHandlingMiddleware>(); var mvcJsonOptions = app.ApplicationServices.GetService <IOptions <MvcJsonOptions> >().Value; mvcJsonOptions.SerializerSettings.Converters.Add(new CartTypesJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new MoneyJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new CurrencyJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new OrderTypesJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new RecommendationJsonConverter(app.ApplicationServices.GetService <IRecommendationProviderFactory>())); var mvcViewOptions = app.ApplicationServices.GetService <IOptions <MvcViewOptions> >().Value; mvcViewOptions.ViewEngines.Add(app.ApplicationServices.GetService <ILiquidViewEngine>()); // Do not use status code pages for Api requests app.UseWhen(context => !context.Request.Path.IsApi(), appBuilder => { appBuilder.UseStatusCodePagesWithReExecute("/error/{0}"); }); // Enable middleware to serve generated Swagger as a JSON endpoint. app.UseSwagger(c => c.RouteTemplate = "docs/{documentName}/docs.json"); var rewriteOptions = new RewriteOptions(); // Load IIS url rewrite rules from external file if (File.Exists("IISUrlRewrite.xml")) { using (var iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) { rewriteOptions.AddIISUrlRewrite(iisUrlRewriteStreamReader); } } rewriteOptions.Add(new StorefrontUrlNormalizeRule()); var requireHttpsOptions = new RequireHttpsOptions(); Configuration.GetSection("VirtoCommerce:RequireHttps").Bind(requireHttpsOptions); if (requireHttpsOptions.Enabled) { rewriteOptions.AddRedirectToHttps(requireHttpsOptions.StatusCode, requireHttpsOptions.Port); } app.UseRewriter(rewriteOptions); // Enable browser XSS protection app.Use(async(context, next) => { context.Response.Headers["X-Xss-Protection"] = "1"; await next(); }); app.UseMvc(routes => { routes.MapSlugRoute("{*path}", defaults: new { controller = "Home", action = "Index" }); }); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/error/500"); app.UseHsts(); } //Do not write telemetry to debug output TelemetryDebugWriter.IsTracingDisabled = true; app.UseResponseCaching(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseAuthentication(); //WorkContextBuildMiddleware must always be registered first in the Middleware chain app.UseMiddleware <WorkContextBuildMiddleware>(); app.UseMiddleware <StoreMaintenanceMiddleware>(); app.UseMiddleware <NoLiquidThemeMiddleware>(); app.UseMiddleware <CreateStorefrontRolesMiddleware>(); app.UseMiddleware <ApiErrorHandlingMiddleware>(); app.UseStatusCodePagesWithReExecute("/error/{0}"); var rewriteOptions = new RewriteOptions(); //Load IIS url rewrite rules from external file if (File.Exists("IISUrlRewrite.xml")) { using (var iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) { rewriteOptions.AddIISUrlRewrite(iisUrlRewriteStreamReader); } } rewriteOptions.Add(new StorefrontUrlNormalizeRule()); var requireHttpsOptions = new RequireHttpsOptions(); Configuration.GetSection("VirtoCommerce:RequireHttps").Bind(requireHttpsOptions); if (requireHttpsOptions.Enabled) { rewriteOptions.AddRedirectToHttps(requireHttpsOptions.StatusCode, requireHttpsOptions.Port); } app.UseRewriter(rewriteOptions); //Enable browser XSS protection app.Use(async(context, next) => { context.Response.Headers["X-Xss-Protection"] = "1"; await next(); }); app.UseMvc(routes => { routes.MapSlugRoute("{*path}", defaults: new { controller = "Home", action = "Index" }); }); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/error/500"); app.UseHsts(); } // Do not write telemetry to debug output TelemetryDebugWriter.IsTracingDisabled = true; app.UseResponseCaching(); app.UseResponseCompression(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseRouting(); app.UseAuthentication(); // WorkContextBuildMiddleware must always be registered first in the Middleware chain app.UseMiddleware <WorkContextBuildMiddleware>(); app.UseMiddleware <StoreMaintenanceMiddleware>(); app.UseMiddleware <NoLiquidThemeMiddleware>(); app.UseMiddleware <CreateStorefrontRolesMiddleware>(); app.UseMiddleware <ApiErrorHandlingMiddleware>(); var mvcJsonOptions = app.ApplicationServices.GetService <IOptions <MvcNewtonsoftJsonOptions> >().Value; mvcJsonOptions.SerializerSettings.Converters.Add(new CartTypesJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new MoneyJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new CurrencyJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new OrderTypesJsonConverter(app.ApplicationServices.GetService <IWorkContextAccessor>())); mvcJsonOptions.SerializerSettings.Converters.Add(new RecommendationJsonConverter(app.ApplicationServices.GetService <IRecommendationProviderFactory>())); var mvcViewOptions = app.ApplicationServices.GetService <IOptions <MvcViewOptions> >().Value; mvcViewOptions.ViewEngines.Add(app.ApplicationServices.GetService <ILiquidViewEngine>()); // Do not use status code pages for Api requests app.UseWhen(context => !context.Request.Path.IsApi(), appBuilder => { appBuilder.UseStatusCodePagesWithReExecute("/error/{0}"); }); // Enable middleware to serve generated Swagger as a JSON endpoint. app.UseSwagger(c => c.RouteTemplate = "docs/{documentName}/docs.json"); var swaggerOptions = app.ApplicationServices.GetService <IOptions <SwaggerOptions> >().Value; if (swaggerOptions.UI.Enable) { app.UseSwaggerUI(c => { c.SwaggerEndpoint($"./{SwaggerDocName}/docs.json", SwaggerDocName); c.RoutePrefix = "docs"; c.EnableValidator(); c.IndexStream = () => { var type = typeof(Startup).GetTypeInfo().Assembly .GetManifestResourceStream("VirtoCommerce.Storefront.wwwroot.swagger.index.html"); return(type); }; c.DocumentTitle = "VirtoCommerce Storefront REST API documentation"; c.InjectStylesheet("/swagger/vc.css"); c.ShowExtensions(); c.DocExpansion(DocExpansion.None); c.DefaultModelsExpandDepth(-1); }); } var rewriteOptions = new RewriteOptions(); // Load IIS url rewrite rules from external file if (File.Exists("IISUrlRewrite.xml")) { using (var iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) { rewriteOptions.AddIISUrlRewrite(iisUrlRewriteStreamReader); } } rewriteOptions.Add(new StorefrontUrlNormalizeRule()); var requireHttpsOptions = new RequireHttpsOptions(); Configuration.GetSection("VirtoCommerce:RequireHttps").Bind(requireHttpsOptions); if (requireHttpsOptions.Enabled) { rewriteOptions.AddRedirectToHttps(requireHttpsOptions.StatusCode, requireHttpsOptions.Port); } app.UseRewriter(rewriteOptions); // Enable browser XSS protection app.Use(async(context, next) => { context.Response.Headers["X-Xss-Protection"] = "1"; await next(); }); // It will be good to rewrite endpoint routing as described here, but it's not easy to do: // https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio#routing-startup-code app.UseMvc(routes => { routes.MapSlugRoute("{*path}", defaults: new { controller = "Home", action = "Index" }); }); }