Ø  简介

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开发【socket篇】解决粘包

    客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8 ...

  2. Configuring High Availability and Consistency for Apache Kafka

    To achieve high availability and consistency targets, adjust the following parameters to meet your r ...

  3. UVALive - 3523 - Knights of the Round Table

    Problem  UVALive - 3523 - Knights of the Round Table Time Limit: 4500 mSec Problem Description Input ...

  4. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...

  5. Codeforces Round 1152 (div. 2)

    奇差.ABC三题,排名400. 首先是策略问题. 由于第一眼看到D的时候感觉不太会做,于是去看E. 一看到E这不欧拉回路吗,可做可做, 于是--我不会欧拉回路! 手推.推了半天啥也没弄出来, 于是大概 ...

  6. 工具篇-Spark-Streaming获取kafka数据的两种方式(转载)

    转载自:https://blog.csdn.net/weixin_41615494/article/details/7952173 一.基于Receiver的方式 原理 Receiver从Kafka中 ...

  7. jdk的安装及环境变量的配置

    一.JDK的下载 1.首先打开JDK的官网(点击打开链接),找到JAVA SE 7u71/72中的JDK,选择Download 2.然后如下图,选择Accept License Agreement,则 ...

  8. ZJOI2019做题笔记

    麻将(期望.DP套DP) 先考虑如何计算一个子集是否能胡. 设\(f_{i,0/1,j,k}\)表示考虑了子集中\(1 \sim i\)的牌,是否找到对子,\(i-1,i,i+1\)预计拿\(j\)个 ...

  9. Auto Layout - BNR

    继续UIImageView - BNR篇. 通过Homepwner TARGETS -> General -> Deployment Info -> Devices中的iPhone改 ...

  10. Scrapy安装报错

    python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C++ 14.0 is required. Get it with "Micro ...