CORS政策中不允许使用请求方法POST

时间:2018-07-27 14:02:13

标签: c# .net ajax asp.net-core cors

我使用asp.net core 2.1来构建Web API,并在我的Web上使用ajax请求api。

首先,我在GET方法上遇到问题,我使用chrome plugin解决了问题。

但是我仍然不能使用post方法。

在网页上

POST https://localhost:5001/api/chatbot 400 (Bad Request)

Visual Studio显示异常。

  

[40m [32minfo [39m [22m [49m:Microsoft.AspNetCore.Hosting.Internal.WebHost 1}         请求启动HTTP / 1.1选项https://localhost:5001/api/chatbot
  Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求启动HTTP / 1.1选项https://localhost:5001/api/chatbot
  Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information:策略执行失败。   [40m [32minfo [39m [22m [49m:Microsoft.AspNetCore.Cors.Infrastructure.CorsService [5]         策略执行失败。   [40m [32minfo [39m [22m [49m:Microsoft.AspNetCore.Cors.Infrastructure.CorsService [7]         CORS策略中不允许使用请求方法POST。   Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information:CORS策略中不允许使用请求方法POST。   [40m [32minfo [39m [22m [49m:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]         请求在21.587毫秒内完成204

而且我已经在 Startup.cs - ConfigureServices()

中使用了cors
options.AddPolicy("CorsPolicy", policy =>
            {
                policy.AllowAnyOrigin()
                      .AllowAnyHeader()
                      .AllowAnyMethod()
                      .AllowCredentials();
            });

Startup.cs - Configure()

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        string swwwRootPath = env.WebRootPath; 
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
        app.UseStaticFiles();

        app.UseAuthentication();

        //app.UseHttpsRedirection();
        app.UseExceptionHandler("/Error");
        //app.UseCors(builder => 
        //builder.WithOrigins("file:///").AllowAnyHeader());

        app.UseCors("CorsPolicy");

        app.UseCors(builder => {
            builder.WithOrigins("file:///").AllowAnyHeader();
        });

        app.UseMvc();
    }

还有我的ajax函数

var json = {"channel":"web", "message":"", "messagetype":"text", "userid":"xxx", "nodeid":nodeid};
$.ajax({
        method: 'POST',
        url: "https://localhost:5001/api/chatbot",
        data: json,
        datatype: "json",
        contentType: "application/json; charset=utf-8",
        success:...

我的控制器

[ApiController]
[Route("api/[controller]")]
public class ChatbotController : Controller
{
    [HttpPost]
    [EnableCors("CorsPolicy")]
    [Produces("application/json")]
    public ActionResult<string> Post([FromBody]RequestModel request)
    {...

RequestModel

public class RequestModel
{
    public string channel { get; set; }
    public string message { get; set; }
    public string messagetype { get; set; }
    public string userid { get; set; }
    public string nodeid { get; set; }
}

GET POST 方法我使用 Postman 时可以得到正确的响应。

有人知道如何解决吗?谢谢。

2 个答案:

答案 0 :(得分:0)

编辑:既然您提供了更多代码,就可以了。 这个

    app.UseCors(builder => {
        builder.WithOrigins("file:///").AllowAnyHeader();
    });

覆盖了初始的全局cors设置,这就是为什么它不起作用的原因。为功能或控制器启用cors听起来不是一个好主意。 CORS是为了确保浏览器安全。您file:///在这里没有意义,而且没有必要。

将方法调用app.UseCors();调整为app.UseCors("CorsPolicy");。您必须提供定义的名称。

答案 1 :(得分:0)

我有一个类似的问题,我也必须在控制器上方添加这一行代码,以允许该实际调用。请注意,您可以更改标题和方法属性,因为这将允许一切...

[EnableCors(origins: "http://yoursitenamehere.org", headers: "*", methods: "*")]
public class SampleController : ApiController
{}

或者您可以将* http://yoursitenamehere.org替换为*,以再次允许所有操作。在发布给产品之前,请不要忘记更改此设置,大声笑。