zoukankan      html  css  js  c++  java
  • 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 路由代码的前面,否则依然会产生如题异常。应该是当接收到一个请求时,是按照路由添加顺序匹配的,匹配到则不继续匹配。

  • 相关阅读:
    让linux下的eclipse支持GBK编码
    Ubuntu 14.04 安装深度音乐的方法(下载速度极慢未成功)
    wine使用
    Sql语句查看表结构
    读数据库所有表和表结构的sql语句
    详解软件工程之软工文档
    浅谈UML的概念和模型之UML九种图
    HTML5 file api读取文件的MD5码工具
    Sublime Text 3 快捷键汇总
    领域驱动设计系列文章汇总
  • 原文地址:https://www.cnblogs.com/abeam/p/9597406.html
Copyright © 2011-2022 走看看