gpt4 book ai didi

c# - 基于属性的 webapi2 路由为某些方法返回 404

转载 作者:太空狗 更新时间:2023-10-29 18:11:59 24 4
gpt4 key购买 nike

我目前正在处理一个已从 Webapi 升级到 Webapi2 的项目。部分转换包括切换到使用基于属性的路由。

我已经在 Global.asax 中适本地设置了我的路由(如下所示)

 GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());

并移除了之前的路由配置。

我已经用适当的 System.Web.Http.RouteAttributeSystem.Web.Http.RoutePrefixAttribute 属性装饰了我的所有 API Controller 。

如果我使用调试器检查 System.Web.Http.GlobalConfiguration.Configuration.Routes,我可以看到我预期的所有路由都已在集合中注册。同样,包含生成的 Webapi Help Page 中提供了适当的路线。文档符合预期。

即使一切看起来都已正确设置,但我的大量 REST 调用导致服务器返回 404 未找到响应。

我发现了一些特定于 GET 方法的显着相似之处(这是我迄今为止测试过的所有内容)

  • 如果一个方法接受 0 个参数,它失败
  • 如果路由覆盖前缀,它失败
  • 如果方法采用字符串参数,则很可能成功
  • 返回类型似乎没有影响
  • 命名路由似乎没有影响
  • 订购路线似乎没有影响
  • 重命名底层方法似乎没有影响

值得注意的是,我的 API Controller 出现在一个单独的区域中,但考虑到某些路由确实有效,我不认为这是手头的问题。

非功能性方法调用示例

[RoutePrefix("api/postman")]
public class PostmanApiController : ApiController
{
...
[HttpGet]
[Route("all", Name = "GetPostmanCollection")]
[ResponseType(typeof (PostmanCollectionGet))]
public IHttpActionResult GetPostmanCollection()
{
return Ok(...);
}
...
}

我希望可以通过 http://[application-root]/api/postman/all

有趣的是调用

Url.Link("GetPostmanCollection", null)

将返回上面预期的 url

在同一个 Controller 中调用方法的一个非常相似的示例,其中一些有效,一些无效。

[RoutePrefix("api/machine")]
public class MachineApiController : ApiController
{
...
[HttpGet]
[Route("byowner/{owner}", Name = "GetPostmanCollection")]
public IEnumerable<string> GetByOwner([FromUri] string owner)
{
...
}
...

[HttpGet]
[Route("~/api/oses/{osType}")]
public IEnumerable<OsAndVersionGet> GetOSes([FromUri] string osType)
{
...
}
...
}

调用 http://[application-root]/api/machineby/ownername 成功并且 http://[application -root]/api/oses/osType 没有。

我已经研究这个问题太久了,您知道问题出在哪里吗?

最佳答案

检查您是否通过 MapHttpAttributeRoutes 配置了 HttpConfiguration 任何 ASP.NET MVC 路由注册之前的方法。

根据 Microsoft 在 Attribute Routing in MVC and Web API 上的 CodePlex 条目设计部分指出:

In most cases, MapHttpAttributeRoutes or MapMvcAttributeRoutes will be called first so that attribute routes are registered before the global routes (and therefore get a chance to supersede global routes). Requests to attribute routed controllers would also be filtered to only those that originated from an attribute route.

因此,在 Global.asax(或注册路由的地方)中调用:

GlobalConfiguration.Configure(c => c.MapHttpAttributeRoutes()); // http routes
RouteTable.Routes.MapRoute(...); // mvc routes

关于c# - 基于属性的 webapi2 路由为某些方法返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145376/

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