为什么CORS在ASP.NET Core 3 Web Api中不起作用?

时间:2019-12-17 13:19:58

标签: asp.net-core asp.net-web-api asp.net-ajax

我尝试编写基于ASP.NET Core 3的简单Web Api。但是我对CORS策略有疑问。那是我的启动类:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddCors();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseCors(
            options => options.WithOrigins("http://myorigin.com").AllowAnyMethod().AllowAnyHeader()
        );

        app.UseForwardedHeaders(new ForwardedHeadersOptions
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
        });

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

这就是我从前端调用它的方式:

function api_call()
    {
        var form = document.forms["userForm"];
        $.ajax({
            type: "GET",
            url: "http://myorigin.com:8080/access",
            contentType: "application/json",
            crossDomain:true,
            success: function (worker) {
                form.elements["result"].value = worker;
            },
            error: function (jxqr, error, status) {
                console.log(jxqr);
                if(jxqr.responseText===""){
                    form.elements["result"].value = jxqr.statusText;
                }
                else{
                    var response = JSON.parse(jxqr.responseText);
                    console.log(response);
                    if (response['Auth']) {
                        $.each(response['Auth'], function (index, item) {
                            form.elements["result"].value = item;
                        });
                    }
                }
            },
        });
    }

但是此函数无法访问API。它返回消息,请求被CORS策略阻止:

  

对预检请求的响应未通过访问控制检查:所请求的资源上没有'Access-Control-Allow-Origin'标头。

在不同的文章中,我尝试以不同的方式使用CORS。我也尝试添加手动CORS中间件,但结果相同。 我的Web Api托管在Ubuntu上,并通过kestrel服务正常运行。同样,当我在Visual Studio中本地运行它并在JS函数路径中写入本地主机(URL:“ http://localhost:56597/access”)时,它会调用API并成功获得响应。

我的错误是什么?我的前端和Web Api位于同一主机上,但是侦听不同的端口。

1 个答案:

答案 0 :(得分:0)

我发现了自己的错误。我忘了在我的Configure方法中添加它:

app.UseAuthentication();

我读过一篇文章,这是我需要的。 在我的Web Api的Apache配置中也有错误。我有这样的参数:

ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/

但是它们应该是这样的:

ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/

现在我的Web Api正在运行,并且CORS没问题。