Nic*_*iff 11 c# asp.net cors asp.net-web-api
我的网络API上有一个端点问题.我有一个POST方法无法正常工作,原因如下:
对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许来源' http:// localhost:3000 '访问.响应具有HTTP状态代码405.
我无法理解为什么这样做不起作用,因为我有很多方法可以使用相同的COSR配置.唯一的区别是此方法具有指定的路由,如下所示:
// POST: api/Clave
[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)]
[Route("{id:int}/clave")]
[HttpPost]
public HttpResponseMessage Post(int id, [FromBody]CambioClaveParameters parametros)
{
UsuarioModel usuario = SQL.GetUsuario(id);
if (Hash.CreateMD5(parametros.ViejaClave) != usuario.Clave.ToUpper())
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
else if (Hash.CreateMD5(parametros.ViejaClave) == usuario.Clave.ToUpper())
{
SQL.ModificarClaveUsuario(id, Hash.CreateMD5(parametros.NuevaClave));
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
Run Code Online (Sandbox Code Playgroud)
任何关于为什么会这样的想法?
谢谢!.
基于消息中的"预检"一词,这是一个OPTIONS动词问题.如果您检查请求和响应,我相信您会在POST之前看到请求是OPTIONS请求.OPTIONS请求询问服务器允许调用哪些方法.如果您尚未启用OPTIONS响应,或者您的OPTIONS响应不包含该Uri的POST方法,您将收到此响应.
这是描述概念的链接(请参阅预检CORS请求部分) https://msdn.microsoft.com/en-us/magazine/dn532203.aspx
为了解决这个问题,绕过OPTIONS所做的一切,您可以将新的或现有模块的BeginRequest方法添加与此类似的代码(不要成为货物程序员):
if (context.Request.HttpMethod.ToLower() == "options")
{
var origin = context.Request.Headers["origin"];
context.Response.StatusCode = 200;
context.Response.AddHeader("Access-Control-Allow-Origin", origin);
context.Response.AddHeader("Access-Control-Allow-Credentials", "true");
context.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
context.Response.End();
}
Run Code Online (Sandbox Code Playgroud)
但是,理想情况下,您可能希望以编程方式确定请求是否有效,如果是,则输出为实际允许的内容定制的响应.