将大量参数传递给OData的最佳方法

时间:2017-05-01 19:44:57

标签: c# asp.net-web-api2 odata bad-request

我和我的团队正在我们的MVC5项目中实现数据层。我们在Web API /后端代码上使用OData。在我们开始对查询字符串施加字符限制之前,一切都很有效。

例如:

这有效:

builder.Function("GetSalesTaxRate")
       .Returns<double>()
       .CollectionParameter<string>("IdentityField");

[HttpGet]
[ODataRoute("GetSalesTaxRate(IdentityField={ids})")]
public IHttpActionResult GetSalesTaxRate([FromODataUri] IEnumerable <string> ids)
{
    double rate = 5.6;  // Use a fake number for the sample.
    return Ok(rate);
}

http://localhost:123456/api/GetSalesTaxRate(IdentityField=['11-3011','11-2011'])

这不起作用:

http://localhost:123456/api/GetSalesTaxRate(IdentityField=['11-3011,11-2011,11-9041,11-1011,11-3111,11-3021,11-9021,11-9032,11-9031,11-9039,11-9033,11-9161,11-9013,11-3031,11-9051,11-9061,11-9071,11-1021,11-3121'])

我收到的错误是:

  

错误的请求。 HTTP错误400.请求URL无效。

     

无法加载资源:服务器响应状态为400   (错误请求)

我试图通过OData使用客户端过滤(使用$ filter机制),以及服务器端自定义数据控制器过滤(通过将[FromODataUri] IEnumerable&lt; string&gt;作为参数传递给方法) 。两者都有限制我的情况。

我从stackoverflow回答中尝试了[UrlSegmentMaxLength]的注册表设置但未成功: Bad Request - Invalid URL web api

我没有成功尝试过这些web.config设置:

<system.web><httpRuntime targetFramework="4.6.1" requestValidationMode="4.0" maxQueryStringLength="2097151" maxUrlLength="10999" relaxedUrlToFileSystemMapping="true" enable="true" />.....
<security><requestFiltering><requestLimits maxQueryString="2097151" maxUrl="10999"/>....

我想在部署到我们网络上的Web服务器之前,让它在我的本地盒子上工作。我怎样才能让它在本地工作?如何让这个端点接受许多&#34; IdentityField&#34;我需要传递的价值观?我试图将其作为IEnumerable&lt;传递给它字符串&gt;以及一个字符串。我对两者都有限制。

我需要以不同方式解决这个问题吗?我已阅读使用POST方法,但我不确定如何做到这一点。我需要能够传递其中的800个&#34; IdentityField&#34;字符串到此端点(大约10,000个字符)。有什么建议或想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

尝试更改最大请求长度。这是iis的限制

<configuration>
<system.web>
    <httpRuntime maxRequestLength="1048576" />
</system.web>