为什么我不能阻止我的 HttpRequest 从 WPF 客户端分块到 Web API 控制器?
Why can't I prevent chunking on my HttpRequest from WPF client to Web API controller?
我已经和这个问题斗争了一个星期了。有关其他背景信息,请参阅 。
我的 WPF
客户端对我的 Web API 控制器进行 GET
、POST
和 PUT
调用。几个星期以来一切都很好。然后突然间,我的 PUT 和 POST 调用的 all 以分块方式进入。我找不到任何方法来阻止它。我强烈怀疑我做了一个影响一切的核心变化,但我已经筋疲力尽地试图找到它。我回顾了源代码管理并恢复了旧代码,但它无法正常工作。
我知道 "request.Headers.TransferEncodingChunked" 但它没有效果。我可以在我的客户端中明确地将它设置为 null 或 false,并且它总是以 true。
我的 PUT/POST 控制器方法遵循此模型。对我来说,结果是我传入的对象(此处为 "User")作为空值到达。但是,如果我根据请求执行 .ReadAsStringAsync()
,我将得到预期的 JSON。但是我不想围绕这种不直观的模式重新设计这个应用程序;被炸毁的物体应该刚刚到达并准备好工作!
[HttpPut]
[ResponseType(typeof(User))]
public IHttpActionResult Put([FromBody] User user)
{
if (user == null)
return Content(HttpStatusCode.BadRequest, "User data is null");
try
{
....etc.
}
}
"User"对象是Entity Framework对象,平淡无奇。简单的字符串、日期时间和数字属性。
同样,同样令人恼火的是,我可以将 request.Headers.AcceptEncoding 设置为 null,它以 Accept-Encoding: gzip 的形式到达我的控制器,放气.
描述相同问题和症状的一些链接:
对此没有明确的答案,但我终于解决了。这是一个漫长的过程。
不知道它是如何到达那里的,但在我的 .csproj 中我有这个:
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
</Reference>
而不是这个:
<Reference Include="System.Net.Http" />
在我的 App.config 我有这个:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
...而不是...不是这个。我不需要这些东西。我刚把它拿出来,它又开始工作了。
我已经和这个问题斗争了一个星期了。有关其他背景信息,请参阅
我的 WPF
客户端对我的 Web API 控制器进行 GET
、POST
和 PUT
调用。几个星期以来一切都很好。然后突然间,我的 PUT 和 POST 调用的 all 以分块方式进入。我找不到任何方法来阻止它。我强烈怀疑我做了一个影响一切的核心变化,但我已经筋疲力尽地试图找到它。我回顾了源代码管理并恢复了旧代码,但它无法正常工作。
我知道 "request.Headers.TransferEncodingChunked" 但它没有效果。我可以在我的客户端中明确地将它设置为 null 或 false,并且它总是以 true。
我的 PUT/POST 控制器方法遵循此模型。对我来说,结果是我传入的对象(此处为 "User")作为空值到达。但是,如果我根据请求执行 .ReadAsStringAsync()
,我将得到预期的 JSON。但是我不想围绕这种不直观的模式重新设计这个应用程序;被炸毁的物体应该刚刚到达并准备好工作!
[HttpPut]
[ResponseType(typeof(User))]
public IHttpActionResult Put([FromBody] User user)
{
if (user == null)
return Content(HttpStatusCode.BadRequest, "User data is null");
try
{
....etc.
}
}
"User"对象是Entity Framework对象,平淡无奇。简单的字符串、日期时间和数字属性。
同样,同样令人恼火的是,我可以将 request.Headers.AcceptEncoding 设置为 null,它以 Accept-Encoding: gzip 的形式到达我的控制器,放气.
描述相同问题和症状的一些链接:
对此没有明确的答案,但我终于解决了。这是一个漫长的过程。
不知道它是如何到达那里的,但在我的 .csproj 中我有这个:
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
</Reference>
而不是这个:
<Reference Include="System.Net.Http" />
在我的 App.config 我有这个:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
...而不是...不是这个。我不需要这些东西。我刚把它拿出来,它又开始工作了。