CORS适用于对API的直接请求,但不适用于静态文件(如css)

时间:2017-08-23 08:27:16

标签: asp.net asp.net-mvc cors asp.net-core-mvc

我们正在开发一个由Android Mobile AppWeb API组成的项目。 Web API是Asp.net MVC Core。

我在CORS上启用了Startup.cs服务,因此移动应用API调用可以访问Cross Origin,我在响应标头中收到access-control-allow-origin →*

API返回到移动应用请求的结果的一部分是包含一些CSS文件的HTML(在移动视图中显示为广告)。在Mobile View中加载HTML时,CSS文件不会加载,因为它们似乎不是Cross Origin可访问的。

我有什么遗失的东西吗?我错过了任何配置步骤吗?

我的CORS配置如下:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddCors(options =>
    {
        options.AddPolicy("RTBCors",
            builder => builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            //.AllowCredentials()
            );
    });
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new Microsoft.AspNetCore.Mvc.Cors.Internal.CorsAuthorizationFilterFactory("RTBCors"));
    });
    services.AddMvc(...);
    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...
    app.UseCors("RTBCors");
    app.UseMvc(routes => .... );
    ...
}

1 个答案:

答案 0 :(得分:0)

app.UseStaticFiles(new StaticFileOptions
            {
                OnPrepareResponse = context =>
                {
                    if (context.File.Name.ToLower().EndsWith(".json"))
                    {
                        var origin = context.Context.Request.Headers[CorsConstants.Origin];
                        var requestHeaders = context.Context.Request.Headers;

                        var isOptionsRequest = string.Equals(context.Context.Request.Method, CorsConstants.PreflightHttpMethod, StringComparison.OrdinalIgnoreCase);
                        var isPreflightRequest = isOptionsRequest && requestHeaders.ContainsKey(CorsConstants.AccessControlRequestMethod);

                        var corsResult = new CorsResult
                        {
                            IsPreflightRequest = isPreflightRequest,
                            IsOriginAllowed = IsOriginAllowed(Policy, origin),
                        };

                   if (!corsResult.IsOriginAllowed)
                        { context.Context.Response.StatusCode = 204;
                           }
                    }

尝试我完整的示例https://github.com/DureSameen/CorsStaticFiles