【问题标题】:web api 2.1 routing not working but same works on mvcweb api 2.1 路由不起作用,但同样适用于 mvc
【发布时间】:2014-06-21 08:07:25
【问题描述】:

我正在向控制器中的同一个操作方法发送多个请求,所有这些请求都有一些常见的查询字符串属性和一些特定于该请求的属性。

request1 : http://localhost/home/test?a=a1&b=b1&c=c1&d=d1....about 25 个参数

request2 : http://localhost/home/test?a=a1&b=b1&j=j1&k=k1...大约 20 个参数

同样的 request 3 , request4,etc...

我在 homecontroller 的 mvc 中的操作方法如下..

public string test(string a, string b, string c, string d, ...大约 50 个参数)

这是完美的工作..

但是当我把这段代码移动到 web api 时,它不再工作了..

此外,如果我尝试只使用两个参数,它可以工作并且我可以获得这两个参数.. 公共字符串测试(字符串 a,字符串 b)

我无法控制我在应用程序中收到的请求,因为它来自第 3 方主机应用程序,因此方法名称和参数无法更改...

route.config中mvc中配置的路由是标准的..

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

我在 webapiconfig 中的类似线路上为 webapi 配置了单独的路由..

config.Routes.MapHttpRoute(
             name: "ActionApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
            ); 

任何想法如何解决这个问题..

谢谢 阿纳布

【问题讨论】:

  • 您是否尝试过在操作上使用 Route 属性?
  • 50个参数的方法!为什么不使用模型呢?
  • @Yasser :请求来自我无法控制的第 3 方..

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing


【解决方案1】:

原因是 Web API 会进行动作重载,并且所有这些参数都是必需的,如果未提供它们,您最终会得到 404。对您的问题的简单回答是通过给它们一个默认值来使它们成为可选,所以您的签名将如下所示:

public IHttpActionResult Get(string a = null, string b = null, ...)

然而,这段代码对于你正在做的事情来说似乎非常复杂,它可能也不是最有效的,你最终会得到很多 if 语句。

也可以考虑自己解析查询字符串,获得更方便使用的数据集。

public class ValuesController : ApiController
{
    public IHttpActionResult Get()
    {
        var collection = Request.RequestUri.ParseQueryString();
        foreach (var key in collection.Keys)
        {
            var value = collection[(string)key];

            // do something with key & value
        }

        return Ok();
    }
}

and as another option is to build a model including all the parameters, something like:

public class Settings
{
    public string A { get; set; }
    public string B { get; set; }
    ...
}

and bind to the model using the FromUri:

public IHttpActionResult Get([FromUri]Settings settings)
{
    ...
}

这是 Mike Stall 博客的链接 - http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

【讨论】:

猜你喜欢
  • 2013-06-23
  • 1970-01-01
  • 2020-07-24
  • 2018-09-17
  • 2018-10-10
  • 2018-08-29
  • 2019-12-11
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多