WCF流在调试时工作,但在部署时不工作

时间:2017-04-05 20:16:04

标签: c# wcf iis

我有一个应用程序,它将大量数据提交给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",但没有运气。

1 个答案:

答案 0 :(得分:1)

通过写入日志文件来替换throw new Exception代码行表明代码没有任何内在错误,并且客户端到服务器的请求流在预期的服务实例下工作正常。本地运行IIS。

相关问题