ASP.NET Web API 2 之路由配置
Ø 简介
ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的。不过,在平常的开发过程中,对它有基本的了解就足够了。因为我们主要关注点并不在此,所以,本文只列出常见的一些问题和解决办法。具体如下:
1. 同一个 Controller 中多个 Action 相同参数的问题
1. 同一个 Controller 中多个 Action 相同参数的问题
1) 问题描述:
1. 当我们在同一个 Controller 中存在多个 Action 相同参数(相同参数数量、参数名、不区分类型)时,例如:
/// <summary>
/// 获取订单详情(取代 api/order/GetOrderDetail 接口)。
/// </summary>
/// <param name="request"></param>
/// <param name="orderId">订单Id。</param>
/// <returns></returns>
[Route("getOrderDetail"), HttpGet]
[ResponseType(typeof(OrderDetailResModel))]
public HttpResponseMessage GetOrderDetail(HttpRequestMessage request, int orderId)
{
return CreateHttpGetResponse(request, () =>
{
OrderDetailResModel data = MainService.GetOrderDetail(orderId);
return data;
}, () =>
{
if (orderId < 0)
return ResponseModel.CreateInstance("订单Id无效");
return null;
});
}
/// <summary>
/// 获取订单客户信息。
/// </summary>
/// <param name="request"></param>
/// <param name="orderId">订单Id。</param>
/// <returns></returns>
[Route("getOrderCustomerInfo"), HttpGet]
[ResponseType(typeof(OrderCustomerInfoResModel))]
public HttpResponseMessage GetOrderCustomerInfo(HttpRequestMessage request, string orderId)
{
return null;
}
2. 发送请求就会报以下异常:
找到了与该请求匹配的多个操作: 类型Api.Oms.Controllers.Order2Controller 的 GetOrderDetail类型Api.Oms.Controllers.Order2Controller 的 GetOrderCustomerInfo
2) 异常分析:
1. 因为在我们的 WebApiConfig.cs 有这样一行代码,这是 Web API 帮我们创建的一个默认路由配置:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
2. 从该配置可以看出,首先匹配 api,其次是 controller,最后是匹配的 id(也就是参数),这样一来,我们上面的两个 action 是不是都能匹配到呢?!比如发送请求,就会匹配到多个 action:
http://localhost:16064/api/order2/getOrderDetail?orderId=92705
或者
http://localhost:16064/api/order2/getOrderCustomerInfo?orderId=92705
3) 解决问题:
1. 既然问题找到了就好解决了,我们在 WebApiConfig.cs 中再加一个路由配置,代码如下:
config.Routes.MapHttpRoute(
name: "ActionRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }
);
2. 这次,我们把 action 匹配也加进来了,所以就算相同的参数只要 action 名不相同就能匹配唯一了,这样问题就解决了。
3. 注意:这句代码需要加在 DefaultApi 路由代码的前面,否则依然会产生如题异常。应该是当接收到一个请求时,是按照路由添加顺序匹配的,匹配到则不继续匹配。
ASP.NET Web API 2 之路由配置的更多相关文章
- 【ASP.NET Web API教程】4.1 ASP.NET Web API中的路由
原文:[ASP.NET Web API教程]4.1 ASP.NET Web API中的路由 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. ...
- ASP.NET Web API中的路由
ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...
- ASP.NET WEB API 中的路由调试与执行过程跟踪
路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...
- Asp.net Web Api开发Help Page配置和扩展
为了方面APP开发人员,服务端的接口都应当提供详尽的API说明.但每次有修改,既要维护代码,又要维护文档,一旦开发进度紧张,很容易导致代码与文档不一致. Web API有一个Help Page插件,可 ...
- ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题
刚才忘了说了,在控制器名重名的情况下,特性路由是不生效的.不然的话就可以利用特性路由解决同名的问题了. 而且这种不生效是真的不生效,不会提示任何错误,重名或者什么的,直接会报告404,所以也是个坑.
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- 2.3属性在 ASP.NET Web API 2 路由
路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...
- Asp.Net Web API 2第五课——Web API路由
Asp.Net Web API 导航 Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web ...
随机推荐
- slice()和splice()区别
1.slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素. 注意:该方法不会改变原数组,而是返回一个子数组,如果想删除 ...
- R语言学习——向量
以下为在RStudio中输入 #为注释符,其后内容程序不执行 > #向量是用于储存数值型.字符型或者逻辑型数据的一维数组.执行组合功能的函数c()可用来创建向量.示例如下: > a< ...
- rtsp 流媒体服务器,播放器
https://github.com/EasyDSS/EasyPlayer-RTSP-Android EasyPlayer EasyPlayer RTSP Android 播放器是由紫鲸团队开发和维护 ...
- Linux实战教学笔记50:Zabbix监控平台3.2.4(二)深入理解zabbix
https://www.cnblogs.com/chensiqiqi/p/9162986.html 一,Zabbix Web操作深入 1.1 Zabbix Web下的主机和模版以及监控项的添加方式 ( ...
- Oracle 执行计划(三)-------表连接方式
SQL FOR TESTING: create table qcb_student_test( student_id number, student_name varchar2(20), studen ...
- P1546 最短网络 Agri-Net题解(克鲁斯卡尔)
P1546 最短网络 Agri-Net 那么这个题是一道最小生成树的板子题 在此讲解kruskal克鲁斯卡尔方法: 原理: 并查集在这里被用到: 众所周知:树满足这样一个定理:如果 图 中有n个节点并 ...
- [SCOI2016]萌萌哒
Luogu P3295 mrclr两周前做的题让蒟蒻的我现在做? 第一眼组合计数,如果把数字相同的数位看作一个整体,除了第一位不能为零,剩下的每一位都有$0$~$9$十种. 设不同的位数为$x$,那么 ...
- Gdi绘图
在使用VC开发项目过程中,界面是项目中的一个子模块.虽然界面并不那么重要,把握住核心功能就可以了,但界面美观与否直接关系到用户的体验, 因此我们也应该关注界面的处理. 我们可以在OnEraseBkgn ...
- iOS开发基础-九宫格坐标(1)
一.功能分析 1)以九宫格展示图片信息,每一个 UIView 包含一个 UIImageView .一个 UILabel 和一个 UIButton . 2)加载App数据,根据数据长度创建对应的格子数: ...
- 一个方法教你认识ref(简单易懂)
参数分为值类型和引用类型,当我们将一个值类型的参数进行传递到另一个方法的时候相当于,将这个变量进行复制到该方法进行操作,但是不会对该变量原始的值有影响. 但是有时候我们需要他有“影响”于是ref就出现 ...