C# 使用WebClient.UploadString将数据发送到WebAPI会导致服务器错误,因为数据值较大

C# 使用WebClient.UploadString将数据发送到WebAPI会导致服务器错误,因为数据值较大,c#,asp.net-web-api,webclient,C#,Asp.net Web Api,Webclient,我正在创建一个工具,用于将要处理的csv输出文件上载到数据库中。出于各种原因,我们正在通过powershell实现自动化,最简单的方法是创建我们自己的Cmdlet集。这在较小的数据集上非常有效,但在较大的数据集上却没有那么好的效果 我们在发送数据时需要跨域,因为我们不能保证所有机器都在同一个域上,甚至在同一个域中。早期,这意味着我们使用了WebClient,因为我们可以通过它访问System.Net.NetworkCredential PS客户端代码的格式很简单: // using Newton

我正在创建一个工具,用于将要处理的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;
}
似乎没有什么改变这种行为

分辨率

我正在使用格式化程序,这会稍微改变游戏:
JsonMediaTypeFormatter

我在其构造函数中添加了这一行:

MaxDepth = int.MaxValue;
我把它添加到web.config中

<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization maxJsonLength="1073741824" />
    </webServices>
  </scripting>
</system.web.extensions>


您是否调试以查看请求是否到达您的代码?@CollinDauphinee是。在调试器中运行时,我可以看到它没有击中WebApi控制器。我对较小的文件很满意,所以我认为这是一个配置问题。。。我只是不知道在哪里。有一个最大JSON长度,我怀疑这是问题所在,但也许可以尝试设置it@CollinDauphinee好主意,在
Web.Config
中设置它,并将WebApiConfig中的
JsonMediaTypeFormatter
设置为
MaxDepth=int.MaxValue
。还是没有爱。它必须是配置,跟踪显示错误代码500,但它从未到达webapi方法。@CollinDauphinee实际上。。。JSON的长度是个问题。。。按照你说的最大深度设置它。重新启动(不仅仅是重新启动),现在可以正常工作了。感谢您结束了一个很长的疑难解答课程。把它放在一个带有ref链接的答案中,我肯定会把它标记为完成。你是否调试过,看看请求是否到达了你的代码?@CollinDauphinee是的。在调试器中运行时,我可以看到它没有击中WebApi控制器。我对较小的文件很满意,所以我认为这是一个配置问题。。。我只是不知道在哪里。有一个最大JSON长度,我怀疑这是问题所在,但也许可以尝试设置it@CollinDauphinee好主意,在
Web.Config
中设置它,并将WebApiConfig中的
JsonMediaTypeFormatter
设置为
MaxDepth=int.MaxValue
。还是没有爱。它必须是配置,跟踪显示错误代码500,但它从未到达webapi方法。@CollinDauphinee实际上。。。JSON的长度是个问题。。。按照你说的最大深度设置它。重新启动(不仅仅是重新启动),现在可以正常工作了。感谢您结束了一个很长的疑难解答课程。把它放在一个带有参考链接的答案中,我一定会把它标记为完成。
<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization maxJsonLength="1073741824" />
    </webServices>
  </scripting>
</system.web.extensions>