Web API 2.0 属性路由("upgraded" 来自 API v1 代码)

Web API 2.0 Attribute Routing ("upgraded" from API v1 Code)

我是 c# 和 asp.net 网络新手 api。
我正在使用 Microsoft Visual Studios 2015 Community Edition。
几天前我得到了一个旧代码。它使用 Microsoft.AspNet.WebAPi(Client/Core/WebHost)(~v4.2).
的旧 NuGet 包 然后我 installed/updated 新版本 (~v5.2.3).
我这样做是为了使用 Web API v2.
的属性路由 我更改了一些内容以适应版本更改。 How to Upgrade an ASP.NET Project
我完成了 Link 中描述的大部分步骤。我没有执行更改视图文件夹中的配置文件的步骤,因为该项目没有视图。
我添加了 1 个带有路由属性的简单方法并将路由属性添加到现有方法

示例 1:

[HttpGet]
[Route("Hello/world/{num:int}")]
public IHttpActionResult GetSimple(int num)
{
    return Ok(num);
}

示例 2:

[HttpGet]
//[AktionName("Confidential Stuff")]
[Route("Hello/world/stuff/{Id:int}/{Id2:int}")]
public HttpResponse Message GetConfidentialStuff(int Id, int Id2)
{
    //do some stuff
    //return stuff
}

构建项目 --> 有效(关于内容的警告已过时,但那是小事)
运行 项目 --> 有效
使用 Postman 执行请求。 --> 部分工作
它确实可以调用“localhost/Hello/world/123”并returned the 123.
但是
它不适用于调用 ' localhost/Hello/world/Stuff/1/2。它 returned:发现与请求 URI 匹配的 HTTP 资源(link 到地址)

编辑

好吧,现在这是我的一些问题:
* 问题是什么?
我在 Postman 中使用的 URI 是错误的。(拼写错误和参数错误)
* 我该如何解决?
使用正确的 URI 和参数
* 为什么样本 1 有效而样本 2 无效?
因为我傻没查
* 如果代码乱七八糟,为什么要编译?它不应该抛出错误吗?
仍然不知道具体的答案,但是是的,如果代码错误,它应该会抛出一个错误
* 如果示例 2 中使用的代码有问题,它应该不会仍然找到 adress/resource 而是 return false Information
是的,应该

问题是约定路由未设置为匹配示例 2 中定义的路由。默认约定路由仅支持一个额外的参数,如 api/{controller}/{id},它匹配示例 1 的方法定义。

解决问题:

或者您编辑 WebApiConfig.cs class 中的约定以接受像这样的额外可选路由参数

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{id2}",
    defaults: new { id = RouteParameter.Optional, id2 = RouteParameter.Optional,  }

);

或者,您可以通过在查询字符串中定义道具来利用属性路由。

像这样定义方法

[Route("Hello/world/stuff")]
public HttpResponse Message GetConfidentialStuff(int Id, int Id2)
{
    //do some stuff
    //return stuff
}

并用 Hello/world/stuff?id=1&id2=2

调用它

记得在 WebApiConfig.cs class

中启用属性路由
config.MapHttpAttributeRoutes();