我使用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()
中使用了corsoptions.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 时可以得到正确的响应。
有人知道如何解决吗?谢谢。
答案 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替换为*,以再次允许所有操作。在发布给产品之前,请不要忘记更改此设置,大声笑。