Asp.net mvc WebAPI2.1路由不起作用,但在mvc上同样起作用
我正在向控制器中的同一个操作方法发送多个请求。所有这些请求都有一些常见的querystring属性,还有一些特定于该请求的属性 请求1:Asp.net mvc WebAPI2.1路由不起作用,但在mvc上同样起作用,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,asp.net-web-api-routing,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,Asp.net Web Api Routing,我正在向控制器中的同一个操作方法发送多个请求。所有这些请求都有一些常见的querystring属性,还有一些特定于该请求的属性 请求1:http://localhost/home/test?a=a1&b=b1&c=c1&d=d1...。大约25个参数 请求2:http://localhost/home/test?a=a1&b=b1&j=j1&k=k1...大约20个参数 同样,请求3、请求4等 我在homecontroller的mvc中的操作方法如下 公共字符串测试(字符串a、字符串b、字符串c
http://localhost/home/test?a=a1&b=b1&c=c1&d=d1...
。大约25个参数
请求2:http://localhost/home/test?a=a1&b=b1&j=j1&k=k1...
大约20个参数
同样,请求3、请求4等
我在homecontroller的mvc中的操作方法如下
公共字符串测试(字符串a、字符串b、字符串c、字符串d,…
。大约50个参数)
这工作做得很好
但是当我把这段代码转移到web api时,它就不再工作了
此外,如果我只尝试使用两个参数,它会起作用,我可以得到这两个参数。。
公共字符串测试(字符串a、字符串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原因是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博客上的链接-您是否尝试过在操作上使用路由属性?一个有50个参数的方法!为什么不改用一个模型呢?@Yasser:这些请求来自我无法控制的第三方。谢谢,基于没有问题的原因,我也在考虑同样的问题,我添加了另一个选项和到另一个更全面博客的链接