gpt4 book ai didi

.net - WebAPI - 属性路由破坏了 WebAPI Cors 的 DELETE?

转载 作者:行者123 更新时间:2023-12-03 17:49:59 26 4
gpt4 key购买 nike

使用以下路线:

routes.MapHttpRoute(
name: "Set",
routeTemplate: "api/set/{id}",
defaults: new { controller = "Set", id = RouteParameter.Optional }
);

映射到以下方法:
    [HttpDelete]
[AcceptVerbs("DELETE")]
public HttpResponseMessage DeleteSet(int id)
{
//stuff
}

我可以通过这个调用删除集合:
   DELETE api/set/1

enter image description here

但是,如果我删除上述路由以支持属性路由:
    [HttpDelete("api/set/{id}")]
[AcceptVerbs("DELETE")]
public HttpResponseMessage DeleteSet(int id)
{
//stuff
}

并添加到我的配置中:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://localhost:11089", "*", "*");
config.MapHttpAttributeRoutes(); // new, working with stuff other than delete
config.EnableCors(cors); // already working, not new
}
}

由于 CORS 问题,相同的请求中断:

enter image description here

在图像中,您会看到一个查询参数,但这适用于仅带有 id 的简单 DELETE 查询。到底他妈发生了什么?我们在属性映射上投入了大量时间,因为 DELETE 不起作用而不得不回滚所有内容会很糟糕。

这是 DELETE 中断的另一个实例,带有一个简单的 id:

enter image description here

以上来自这个请求:
var options = {
url: apiEndpoint + 'card/' + id,
type: 'DELETE',
dataType: 'json',
xhrFields: {
withCredentials: true
}
};

return $.ajax(options)

更新
如果我们用' [AcceptVerbs("OPTIONS")] 来处理所有的删除方法'然后它起作用了。似乎不雅,如果有人有权威答案,我想保持开放状态。

最佳答案

您似乎遇到了将 CORS 与属性路由结合使用的已知问题。以下问题目前正在跟踪。

http://aspnetwebstack.codeplex.com/workitem/954

这是由于属性路由在生成路由时创建的 httpmethod 约束。

解决方法 (这里有几个选项):

  • 也使用 HttpOptions 动词属性显式装饰操作,以便也添加此约束并且您的 OPTIONS 请求可以通过。
  • 创建一个自定义路由构建器,将 OPTIONS 添加到所有路由(如果愿意,您可以修改此行为)。一些示例代码:
    config.MapHttpAttributeRoutes(new CustomRouteBuilder());

    public class CustomRouteBuilder : HttpRouteBuilder
    {
    public override IHttpRoute BuildHttpRoute(HttpRouteValueDictionary defaults, HttpRouteValueDictionary constraints,
    string routeTemplate)
    {
    HttpMethodConstraint currentMethodConstraint = (HttpMethodConstraint)constraints["httpMethod"];
    List<HttpMethod> methods = currentMethodConstraint.AllowedMethods.ToList();
    if (!methods.Contains(HttpMethod.Options))
    {
    methods.Add(HttpMethod.Options);
    }

    HttpMethodConstraint newMethodConstraint = new HttpMethodConstraint(methods.ToArray());
    HttpRouteValueDictionary newConstraints = new HttpRouteValueDictionary();
    newConstraints["httpMethod"] = newMethodConstraint;
    return base.BuildHttpRoute(defaults, newConstraints, routeTemplate);
    }
    }
  • 关于.net - WebAPI - 属性路由破坏了 WebAPI Cors 的 DELETE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799843/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com