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

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

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

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

API 返回给移动应用请求的部分结果是包含一些 CSS 文件的 HTML(在移动 View 中显示为广告)。在移动 View 中加载 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 => .... );
    ...
}

最佳答案

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

关于asp.net - CORS 适用于对 API 的直接请求,但不适用于静态文件(如 css),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834483/

相关文章:

c# - 使用 Auth header (如 webAPI 但在 MVC 中)进行身份验证

javascript - Ext js 6.2 CORS 不适用于 viewModel 中声明的商店

javascript - CORS 重定向工作意外

cors - 如何在 PHP 中为 amp-form 输出正确的标题?

c# - 从 asp.net 读取配置文件

asp.net-mvc - 将 CurrentUICulture 传递给 ASP.NET MVC 3.0 中的异步任务

客户端验证后阻止 asp.net 回发

jquery - 有没有办法用jquery刷新页面而不执行location.reload()?

c# - 如何在 aspx.cs 文件中使用动态单选按钮

c# - table /座位分配算法