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

Mah*_*ari 5 asp.net asp.net-mvc cors asp.net-core-mvc

我们正在开发一个由 AndroidMobile AppWeb API. Web API 是 Asp.net MVC Core。

我已经启用了CORS服务于我Startup.cs,因此移动应用程序的API调用是跨源访问,我收到access-control-allow-origin ?*的响应头。

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

有什么我想念的吗?我错过了任何配置步骤吗?


我的 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 => .... );
    ...
}
Run Code Online (Sandbox Code Playgroud)

小智 2

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;
                           }
                    }
Run Code Online (Sandbox Code Playgroud)

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