CORS无法使用路由

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)

任何关于为什么会这样的想法?

谢谢!.

Dav*_*one 5

基于消息中的"预检"一词,这是一个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)

但是,理想情况下,您可能希望以编程方式确定请求是否有效,如果是,则输出为实际允许的内容定制的响应.