C# 使用WebClient.UploadString将数据发送到WebAPI会导致服务器错误,因为数据值较大
我正在创建一个工具,用于将要处理的csv输出文件上载到数据库中。出于各种原因,我们正在通过powershell实现自动化,最简单的方法是创建我们自己的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
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>