Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc WebAPI2.1路由不起作用,但在mvc上同样起作用_Asp.net Mvc_Asp.net Mvc 4_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

Asp.net mvc WebAPI2.1路由不起作用,但在mvc上同样起作用

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

我正在向控制器中的同一个操作方法发送多个请求。所有这些请求都有一些常见的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、字符串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:这些请求来自我无法控制的第三方。谢谢,基于没有问题的原因,我也在考虑同样的问题,我添加了另一个选项和到另一个更全面博客的链接