我有一个应用程序,它将大量数据提交给WCF Web服务。由于数据可能很大,我想使用 Streamed TransportMode,因此我可以处理数据,而不是全部缓冲。
当我调试应用程序时,流式传输按预期工作。一旦我实际将服务发布到我的IIS服务器,流式传输不再有效,数据似乎只是被缓冲。
我通过在Web服务功能的开头添加throw new Exception
来测试它,并更改了源流以提供"无限数据"。
以下是服务器源代码:
[ServiceContract]
public class Service1
{
[OperationContract]
public void SubmitData(Stream stream)
{
throw new Exception("Test");
using (var reader = new StreamReader(stream))
{
string line = reader.ReadLine();
// Do Something...
}
}
}
以下是客户端代码:
Service1Client client = new Service1Client();
client.Endpoint.Address = new EndpointAddress(address);
client.Open();
using (var stream = new InfiniteDataStream())
client.SubmitData(stream);
client.Close();
class InifiteDataStream : Stream
{
...
public override int Read(byte[] buffer, offset, count)
{
// Create random data...
return count;
}
...
}
服务器Web.Config:
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding transferMode="Streamed" maxReceivedMessageSize="2147483647">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</basicHttpsBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
</system.serviceModel>
客户App.Config:
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding name="BasicHttpsBinding_Service1" transferMode="Streamed" >
<security mode="TransportWithMessageCredential" />
</binding>
</basicHttpsBinding>
</bindings>
<client>
<endpoint address="https://localhost:56297/WebService/Service1.svc"
binding="basicHttpsBinding" bindingConfiguration="BasicHttpsBinding_Service1"
contract="WebService.Service1" name="BasicHttpsBinding_Service1" />
</client>
就像我说的那样,这个代码在我调试VS(带有IIS Express)的时候应该是怎样的,当我运行客户端时它会立即给出异常。当我运行指向Web服务器的客户端它只是坐在那里,直到它最终获得接收超时异常。从缓冲传输中可以预期,因为它永远不会进行缓冲。如果我在指向Web服务器时调试客户端应用程序,我可以看到正在流中调用Read函数。
IIS中是否存在需要更改的某种配置?我查看了设置并没有看到任何明显的信息。
更新 我发现这个Microsoft论坛主题帖https://social.msdn.microsoft.com/Forums/vstudio/en-US/cfe625b2-1890-471b-a4bd-94373daedd39/streamedrequest-possible-under-iis?forum=wcf 最后一条评论表明这是一个在.Net 4.5中修复的错误,但我在4.6.1
中建立此外,我的服务器正在运行IIS 8.5,所以我决定在我的本地Win10机器上尝试相同的测试,该机器上有IIS 10,仍在做同样的事情。
使用Wireshark我能够确认数据正在流式传输到服务器,它只是没有被服务器处理。
我也尝试将transferMode="Streamed"
更改为transferMode="StreamedRequest"
,但没有运气。
答案 0 :(得分:1)
通过写入日志文件来替换throw new Exception
代码行表明代码没有任何内在错误,并且客户端到服务器的请求流在预期的服务实例下工作正常。本地运行IIS。