2016-11-03 4 views
3

У меня есть собственный проект ASP .NET Core. Я обслуживаю содержимое из статической папки (без проблем). Он обрабатывает изображения без перекрестных ссылок (появляется заголовок CORS). Однако для некоторых типов файлов, таких как JSON, заголовки CORS не отображаются, а клиентский сайт не может видеть контент. Если я переименую файл в неизвестный тип (например, JSONX), он будет обслуживаться с заголовками CORS, без проблем. Как я могу заставить эту вещь обслуживать все с заголовком CORS?ASP.NET Core: заголовки CORS только для определенных статических типов файлов

Я имею политику следующих CORS установить в моем Startup.cs:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddCors(options => 
     { 
      options.AddPolicy("CorsPolicy", 
       builder => builder.AllowAnyOrigin() 
       .AllowAnyMethod() 
       .AllowAnyHeader() 
       .AllowCredentials()); 
     }); 

     // Add framework services. 
     services.AddMvc(); 
    } 

И следующий мой Configure

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.UseCors("CorsPolicy"); 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     // Static File options, normally would be in-line, but the SFO's file provider is not available at instantiation time 
     var sfo = new StaticFileOptions() { ServeUnknownFileTypes = true, DefaultContentType = "application/octet-stream", RequestPath = "/assets"}; 
     sfo.FileProvider = new PhysicalFileProvider(Program.minervaConfig["ContentPath"]); 
     app.UseStaticFiles(sfo); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 
+1

Что делать, если вы вызываете 'app.UseCors (" CorsPolicy ")' * после * вызова 'app.UseStaticFiles (sfo)'? – haim770

+0

Я только что протестировал его: если CORS появится, то ни один из статических файлов не получит заголовок CORS. – Blake

ответ

0

Middleware может помочь с таким родом сложной логики. Я получил это, чтобы работать недавно для источников JavaScript. Похоже, что медиа-тип для JSON - это «application/json».

/* 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Http; 

Made available under the Apache 2.0 license. 
https://www.apache.org/licenses/LICENSE-2.0 
*/ 

/// <summary> 
/// Sets response headers for static files having certain media types. 
/// In Startup.Configure, enable before UseStaticFiles with 
/// app.UseMiddleware<CorsResponseHeaderMiddleware>(); 
/// </summary> 
public class CorsResponseHeaderMiddleware 
{ 
    private readonly RequestDelegate _next; 

    // Must NOT have trailing slash 
    private readonly string AllowedOrigin = "http://server:port"; 


    private bool IsCorsOkContentType(string fieldValue) 
    { 
     var fieldValueLower = fieldValue.ToLower(); 

     // Add other media types here. 
     return (fieldValueLower.StartsWith("application/javascript")); 
    } 


    public CorsResponseHeaderMiddleware(RequestDelegate next) { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     context.Response.OnStarting(ignored => 
     { 
      if (context.Response.StatusCode < 400 && 
       IsCorsOkContentType(context.Response.ContentType)) 
      { 
       context.Response.Headers.Add("Access-Control-Allow-Origin", AllowedOrigin); 
      } 

      return Task.FromResult(0); 
     }, null); 

     await _next(context); 
    } 
}