【问题标题】:Web Api Method accepting string, int, alphanumericWeb Api 方法接受字符串、整数、字母数字
【发布时间】:2015-11-29 15:20:00
【问题描述】:

我正在研究一些 Web Api 方法,并遇到了一个场景,其中我们传递了三种不同类型的参数:数字、字符串和字母数字值。

这是我的路由信息​​:

string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
string numeric = @"^\d+$";

config.Routes.MapHttpRoute(
   name: "DefaultApiControllerActionName",
   routeTemplate: "api/{controller}/{action}/{name}",
   defaults: null,
   constraints: new { action = alphanumeric }
);

config.Routes.MapHttpRoute(
   name: "DefaultApiControllerActionId",
   routeTemplate: "api/{controller}/{action}/{id}",
   defaults: null,
   constraints: new { action = alphanumeric, id = numeric }
);

有了这条路线信息,我可以获得字符串和字母数字值,但不能获得数字(通过相同的方法)。这是我的代码:

public IEnumerable<Deliveries> GetByAdvanced(string name)
{
    var deliveries = ...

    return deliveries;
}

例如示例 Web API 网址

现在,如果我添加另一种方法来处理 int 值,它工作得非常好。例如下面的代码

public IEnumerable<Deliveries> GetByAdvanced(int id)
{
    var deliveries = ...

    return deliveries;
}

这是接受这些值的正确方式吗?

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-web-api2 asp.net-web-api


    【解决方案1】:

    如果它只影响一种方法,那么您可以在控制器中尝试Attribute Routing,而不是修改路由配置。

    试试下面的方法

    [Route("Api/Deliveries/{id}/{StringVal}/{AlphaVal}")]
    public IEnumerable<Deliveries> GetByAdvanced(int id, string StringVal, string AlphaVal)
    {
      var deliveries = ...
    
      return deliveries;
    }
    

    【讨论】:

      【解决方案2】:

      查看您的示例 Web API 网址,它们都应该可以工作。
      我使用以下配置创建了两个简单的新 Web 项目:
      1) MVC4、Web Api 和 .NET 4
      2) MVC 5、Web Api 2.2 和 .NET 4.5.1
      我在控制器中使用了与您提供的相同的路由和相同的操作方法,并且所有示例执行都正常工作。你的整个 web api 配置文件看起来如何?您是否在操作方法或控制器上定义了一些额外的路由并且您没有向我们展示?

      公共静态类 WebApiConfig { 公共静态无效寄存器(HttpConfiguration 配置) { config.MapHttpAttributeRoutes(); 字符串字母数字 = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$"; 字符串数字 = @"^\d+$"; config.Routes.MapHttpRoute( name: "DefaultApiControllerActionName", routeTemplate: "api/{controller}/{action}/{name}", 默认值:空, 约束:新 { 动作 = 字母数字 } ); config.Routes.MapHttpRoute( name: "DefaultApiControllerActionId", routeTemplate: "api/{controller}/{action}/{id}", 默认值:空, 约束:新 { action = 字母数字,id = numeric } ); } }

      控制器:

      公共类 DeliveryController : ApiController { 公共字符串GetByAdvanced(字符串名称) { 返回名称; } }


      顺便提一句。为什么要为动作名称指定约束?

      【讨论】:

        猜你喜欢
        • 2020-09-11
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多