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