public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // If development, enable Hot Module Replacement // If production, enable Brotli/Gzip response compression & strict transport security headers if (env.IsDevelopment()) { app.UseDeveloperExceptionPage() .UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions { HotModuleReplacement = true }); } else { app.UseResponseCompression(); app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } // Global exception handling app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); // Enable all custom health checks registered earlier (browse to {url}/healthchecks-ui to UI / {url}/healthchecks-json to raw JSON) app.UseApiHealthChecks("/healthchecks-json") .UseHealthChecksUI(); // Register the Swagger generator and the Swagger UI middlewares // NSwage.MsBuild + adding automation config in GhostUI.csproj makes this part of the build step (updates to API will be handled automatically) app.UseSwaggerUi3(settings => { settings.Path = "/docs"; settings.DocumentPath = "/docs/api-specification.json"; }); app.UseCors("AllowAll") .UseDefaultFiles() .UseStaticFiles() .UseSignalR((options) => options.MapHub <UsersHub>("/hubs/users")) .UseMvc(routes => { routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}") .MapSpaFallbackRoute("spa-fallback", new { controller = "Home", action = "Index" }); }); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHttpsRedirection(); app.UseHsts(); } app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); app.UseCors(_corsPolicyName); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller}/{action=Index}/{id?}"); }); app.UseSpa(spa => { spa.Options.SourcePath = _spaSourcePath; if (env.IsDevelopment()) { // Option 1: Run npm process with client app (VueCli - pretty buggy, likely should stick with second option and launch client independently) // spa.Options.StartupTimeout = new TimeSpan(days: 0, hours: 0, minutes: 1, seconds: 30); // spa.UseVueCli(npmScript: "serve", port: 8080); // Option 2: Serve ClientApp independently and proxy requests from ClientApp (baseUri using Vue app port): spa.UseProxyToSpaDevelopmentServer("http://localhost:8080"); } }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseCors(_corsPolicyName); app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); endpoints.MapControllers(); endpoints.MapDefaultControllerRoute(); //endpoints.MapFallbackToFile("/index.html"); }); app.UseSpa(spa => { spa.Options.SourcePath = "ClientApp"; spa.UseProxyToSpaDevelopmentServer("http://localhost:5001"); }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHttpsRedirection(); app.UseHsts(); } app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseRouting(); app.UseCors(_corsPolicyName); app.UseEndpoints(endpoints => { endpoints.MapControllers(); if (System.Diagnostics.Debugger.IsAttached) { endpoints.MapToVueCliProxy("{*path}", new SpaOptions { SourcePath = _spaSourcePath }, "serve", regex: "running at"); } else { endpoints.MapFallbackToFile("index.html"); } }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // If development, enable Hot Module Replacement // If production, enable Brotli/Gzip response compression & strict transport security headers if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseResponseCompression(); app.UseExceptionHandler("/Error"); app.UseHsts(); } // Global exception handling app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); app.UseCors(_corsPolicyName); // Show/write HealthReport data from healthchecks (AspNetCore.HealthChecks.UI.Client nuget package) app.UseHealthChecksUI(); app.UseHealthChecks("/healthchecks-json", new HealthCheckOptions() { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }); // Register the Swagger generator and the Swagger UI middlewares // NSwage.MsBuild + adding automation config in GhostUI.csproj makes this part of the build step (updates to API will be handled automatically) app.UseOpenApi(); app.UseSwaggerUi3(settings => { settings.Path = "/docs"; settings.DocumentPath = "/docs/api-specification.json"; }); // app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseRouting(); // Map controllers / SignalR hubs / HealthChecks // Configure VueCliMiddleware package to handle startup of Vue.js ClientApp front-end app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHub <UsersHub>("/hubs/users"); if (System.Diagnostics.Debugger.IsAttached) { endpoints.MapToVueCliProxy( "{*path}", new SpaOptions { SourcePath = _spaSourcePath }, npmScript: "serve", regex: "running at", port: 3001, forceKill: true ); } else { endpoints.MapFallbackToFile("index.html"); } }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // If development, enable Hot Module Replacement // If production, enable Brotli/Gzip response compression & strict transport security headers if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); // There does not yet appear to be a finalized solution to replace this obselete framework. // app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions // { // HotModuleReplacement = true // }); } else { app.UseResponseCompression(); app.UseExceptionHandler("/Error"); app.UseHttpsRedirection(); app.UseHsts(); } // Global exception handling app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); app.UseCors(_corsPolicyName); app.UseStaticFiles(); // Register the Swagger generator and the Swagger UI middlewares // NSwage.MsBuild + adding automation config in GhostUI.csproj makes this part of the build step (updates to API will be handled automatically) app.UseOpenApi(); app.UseSwaggerUi3(settings => { settings.Path = "/docs"; settings.DocumentPath = "/docs/api-specification.json"; }); app.UseSpaStaticFiles(); app.UseRouting(); // Map controllers / SignalR hubs / HealthChecks app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHub <UsersHub>("/hubs/users"); endpoints.MapHealthChecks("/healthchecks-json", new HealthCheckOptions { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }); endpoints.MapHealthChecksUI(); }); app.UseSpa(spa => { spa.Options.SourcePath = _spaSourcePath; if (env.IsDevelopment()) { spa.UseReactDevelopmentServer(npmScript: "start"); } }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // If development, enable Hot Module Replacement // If production, enable Brotli/Gzip response compression & strict transport security headers if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); // There does not yet appear to be a finalized solution to replace this obselete framework. // app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions // { // HotModuleReplacement = true // }); } else { app.UseResponseCompression(); app.UseExceptionHandler("/Error"); app.UseHttpsRedirection(); app.UseHsts(); } // Global exception handling app.UseExceptionHandler(builder => { builder.Run(async context => { var error = context.Features.Get <IExceptionHandlerFeature>(); var exDetails = new ExceptionDetails((int)HttpStatusCode.InternalServerError, error?.Error.Message); context.Response.ContentType = "application/json"; context.Response.StatusCode = exDetails.StatusCode; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); context.Response.Headers.Add("Application-Error", exDetails.Message); context.Response.Headers.Add("Access-Control-Expose-Headers", "Application-Error"); await context.Response.WriteAsync(exDetails.ToString()); }); }); app.UseCors(_corsPolicyName); app.UseStaticFiles(); app.UseSpaStaticFiles(); app.UseRouting(); // Map controllers app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.UseSpa(spa => { spa.Options.SourcePath = _spaSourcePath; if (env.IsDevelopment()) { spa.UseReactDevelopmentServer(npmScript: "start"); } }); }