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();
我是 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();