使用WebClient.UploadString将数据发送到WebAPI会导致更大的数据值

时间:2015-10-21 00:55:17

标签: c# asp.net-web-api webclient

我正在创建一个工具,用于将要处理的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>

0 个答案:

没有答案