Ø  简介

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 之路由配置的更多相关文章

  1. 【ASP.NET Web API教程】4.1 ASP.NET Web API中的路由

    原文:[ASP.NET Web API教程]4.1 ASP.NET Web API中的路由 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. ...

  2. ASP.NET Web API中的路由

    ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...

  3. ASP.NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  4. Asp.net Web Api开发Help Page配置和扩展

    为了方面APP开发人员,服务端的接口都应当提供详尽的API说明.但每次有修改,既要维护代码,又要维护文档,一旦开发进度紧张,很容易导致代码与文档不一致. Web API有一个Help Page插件,可 ...

  5. ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题

    刚才忘了说了,在控制器名重名的情况下,特性路由是不生效的.不然的话就可以利用特性路由解决同名的问题了. 而且这种不生效是真的不生效,不会提示任何错误,重名或者什么的,直接会报告404,所以也是个坑.

  6. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  7. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  8. 2.3属性在 ASP.NET Web API 2 路由

    路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...

  9. 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 ...

随机推荐

  1. Python中的一些小技巧

    1.Boolean值可以当做一个数值 a = [5,6,7,8,9] print(a[True]) #prints 6 print(a[False]) #prints 5 2.两种方法实现 a = 1 ...

  2. Python开发【内置模块篇】datetime

    获取当前日期和时间 >>> from datetime import datetime >>> now = datetime.now() >>> ...

  3. nginx [alert] 12339#0: 1024 worker_connections are not enough

    进一步分析报错原因,具体步骤如下: l  查看这两台系统最大的允许文件打开数 [root@nginx01 logs]# cat /proc/sys/fs/file-max 343927 l  通过ul ...

  4. 实现element-ui中table点击一行展开

    转:https://www.jianshu.com/p/e51ba4cb11d6 先上效果   效果图 三要素 1.row-click 点击行 2.ref 自行了解vue 3.toggleRowExp ...

  5. springboot2+freemarker简单使用

    一.src/main/resources/templates下新建welcome.ftl <!DOCTYPE html> <html lang="en"> ...

  6. sklearn.neural_network.MLPClassifier参数说明

    目录 sklearn.neural_network.MLPClassifier sklearn.neural_network.MLPClassifier MLPClassifier(hidden_la ...

  7. RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your c

    Error Msg: Traceback (most recent call last): File "<string>", line 1, in <module ...

  8. VS2010安装MVC4记录

    想学MVC4,但自己电脑上是VS2010,所以在网上查询怎样安装MVC4,总结下给大家. VS2010默认安装的是MVC2,安装MVC4必须先装 SP1,然后安装MVC4. VS2010 SP1 (1 ...

  9. NOIP2015普及组复赛A 推销员

    题目链接:https://ac.nowcoder.com/acm/contest/243/A 题目大意: 略 分析: 方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i > ...

  10. Python——Pycharm基本设置

    一.,模板(加入中文UTF-8) #!/usr/bin/env python # -*- coding:utf-8 -*- 设置方法:file->settings->Editor-> ...