我正在创建一个工具,用于将要处理的csv输出文件上传到数据库中。由于各种原因,我们通过PowerShell自动执行此操作,最简单的方法是创建我们自己的Cmdlet
集。这对我们较小的数据集非常有效,但是对于我们较大的数据集却没有那么热。
我们要求在发送数据时是跨域的,因为我们不能保证我们所有的计算机都在同一个域,甚至在域中。在早期,这意味着我们选择了WebClient
,因为我们可以访问System.Net.NetworkCredential
。
PS客户端代码的格式很简单:
// using Newtonsoft.Json for serializing
// ResPack resultsPackage is just a container class with some info
// plus one or more log files read in earlier
var postBody = JsonConvert.SerializeObject(resultsPackage)
response = await client.UploadStringTaskAsync(_uri, postBody);
我在IIS8.5(本地通过Win 8.1)环境中使用WebApi2接受这些文件作为POST并保持它非常简单:
[HttpPost]
public async Task<ResultsPackageResponse> Post()
{
dynamic contentJson = await Request.Content.ReadAsStringAsync();
var content = JsonConvert.DeserializeObject<ResultsPackageInfo>(contentJson) as ResultsPackageInfo;
var response = new ResultsPackageResponse();
if (!string.IsNullOrEmpty(content.ClassicLogData))
{
var dataClassic = DeserializeClassicLogWithMap<ClassicLog, ClassicLogMap>(content.ClassicLogData);
response.ClassicLogResultId = ImportClassicResultsToDb(dataClassic, content.ReportSetup);
}
if (!string.IsNullOrEmpty(content.NewLogData))
{
var dataNewLog = DeserializeNewLogWithMap<ClassicLog, ClassicLogMap>(content.NewLogData);
response.NewLogResultId = ImportNewResultsToDb(dataNewLog, content.ReportSetup);
}
return response;
}
由于其他一些工具互动,WebApiConfig.cs
设置为使用JsonMediaTypeFormatter
。
这适用于较小的postBody
大小(序列化的文件大约为34k)但我们开始处理另一种类型的日志文件,它开始抛出webResponse.StatusCode
内部服务器错误500(这大约是140k-800k) )。实际上这些文件并不是那么大,所以我对使用较大的文件感到惊讶。
我已经检查了数据本身,它是有效的并且格式正确。
我已经在线查看了尺寸限制,虽然这听起来不像是遇到了所有问题,但我已将这些更改实施到我的Web.Config
:
<system.web>
<httpRuntime targetFramework="4.5.1" executionTimeout="240000" maxRequestLength="1073741824" />
</system.web>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value ="1073741824"/>
</appSettings>
似乎没有改变这种行为。
解决
我正在使用格式化程序,这会稍微改变游戏:JsonMediaTypeFormatter
我在构造函数中添加了这一行:
MaxDepth = int.MaxValue;
我将此添加到web.config
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="1073741824" />
</webServices>
</scripting>
</system.web.extensions>