web api 2.1路由无法正常工作,但同样适用于mvc

时间:2014-05-05 05:31:07

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

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

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

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

同样请求3,request4等...

我在homecontroller中的mvc中的动作方法如下。

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

这完美地运作..

但是当我接受这段代码并将其移至web api时,它就不再适用了..

此外,如果我只尝试两个参数,它可以工作,我可以得到两个参数.. public string test(string a,string b)

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

在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 }
            ); 

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

由于 ARNAB

1 个答案:

答案 0 :(得分: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