C# Web API 2.0属性路由(从API v1代码“升级”)

C# Web API 2.0属性路由(从API v1代码“升级”),c#,asp.net-mvc-4,asp.net-web-api,asp.net-web-api2,C#,Asp.net Mvc 4,Asp.net Web Api,Asp.net Web Api2,我不熟悉c#和asp.net web api。 我正在与Microsoft Visual Studio 2015社区版合作。 几天前,我得到了一个旧代码。它使用了Microsoft.AspNet.WebAPi(Client/Core/WebHost)(~v4.2)的旧NuGet包。 然后我安装/更新了新版本(~v5.2.3)。 我这样做是为了使用Web API v2的属性路由。 为了适应版本的变化,我改变了一些东西。 我完成了链接中描述的大部分步骤。我没有执行更改视图文件夹中配置文件的步骤,因

我不熟悉c#和asp.net web api。
我正在与Microsoft Visual Studio 2015社区版合作。
几天前,我得到了一个旧代码。它使用了Microsoft.AspNet.WebAPi(Client/Core/WebHost)(~v4.2)的旧NuGet包。
然后我安装/更新了新版本(~v5.2.3)。
我这样做是为了使用Web API v2的属性路由。
为了适应版本的变化,我改变了一些东西。
我完成了链接中描述的大部分步骤。我没有执行更改视图文件夹中配置文件的步骤,因为此项目没有视图。
我添加了1个带有Route属性的简单Methode,并向现有Methode添加了Route属性

样本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
}
构建项目-->工作正常(关于内容过时的警告,但这是一件小事)
运行项目-->已工作
使用邮递员执行请求。-->部分工作
它确实可以调用“localhost/Hello/world/123”并返回123。
但是
它无法调用“localhost/Hello/world/Stuff/1/2”。它返回:找到了与请求URI(指向地址的链接)匹配的HTTP资源

编辑

好了,下面是我的一些问题:
*有什么问题吗?
我在Postman中使用的URI错误。(拼写错误和参数错误)
*如何修复它?
使用正确的URI和参数
*为什么样本1工作,但样本2不起作用?
因为我愚蠢&没有检查
*如果代码乱七八糟,为什么要编译?它不应该抛出错误吗?
仍然不知道具体的答案,但如果代码错误,它会抛出错误
*如果示例2中使用的代码有问题,它是否仍能找到地址/资源,但返回错误信息

是的,它应该

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

要解决这个问题:

要么在WebApiConfig.cs类中编辑约定,以接受额外的可选路由参数,如下所示

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
}
或者,您可以通过在querystring中定义props来利用属性路由

像这样定义方法

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类中启用属性Routing

config.MapHttpAttributeRoutes();

因为我说了些愚蠢的话,所以我对我最后的评论进行了深入研究。现在让我们用不那么愚蠢的措辞再试一次:)。我想利用属性路由,但不是在querystring中定义它们,而是让它们成为本例中的路由。最后我想要像localhost/Hello/World/123/stuff/456这样的东西/Things@IljamoIlias抱歉重播晚了。我一直在调查属性路由约束,但找不到关于默认约束选项在设置中不起作用的解释谢谢您的回复和帮助。问题只是我的愚蠢。。。我应该仔细检查我在《邮递员》中的URI,并拼写检查所有内容。至少现在我知道了。