以编程方式配置WCF流服务的错误响应(400)

时间:2009-08-25 08:27:10

标签: c# wcf soap streaming

如果我第一次尝试使用流媒体进行WCF,我正在努力应对可怕的“远程服务器返回意外响应:(400)错误请求”响应。

跟踪查看器说这是一个System.ServiceModel.ProtocolException,消息“从网络收到的XML存在问题。有关更多详细信息,请参阅内部异常。”内部异常类型显示“消息正文无法读取,因为它是空的。

如果我在客户端切换到缓冲模式,其他一切都是平等的,我可以调试到服务器代码!

出于某种原因,我必须以编程方式配置我的服务,如下所示:

    public IUniverseFileService OpenProxy(string serviceUrl)
    {
        Debug.Assert(!string.IsNullOrEmpty(serviceUrl));

        var binding = new BasicHttpBinding();
        binding.Name = "basicHttpStream";
        binding.MaxReceivedMessageSize = 1000000;
        binding.TransferMode = TransferMode.Streamed;

        var channelFactory = 
           new ChannelFactory<localhost.IUniverseFileService>(
              binding, 
              new EndpointAddress(serviceUrl));

        return channelFactory.CreateChannel();
    }

服务器配置如下:

 <system.serviceModel>
    <!-- BEHAVIORS -->
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- SERVICES -->
    <services>
      <service behaviorConfiguration="serviceBehavior" name="Org.Acme.UniverseFileService">
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  name="basicHttpStream" 
                  bindingConfiguration="httpLargeMessageStream"
                  contract="Org.Acme.RemoteCommand.Service.IUniverseFileService" /> 
        <endpoint address="mex" 
                  binding="mexHttpBinding" 
                  bindingConfiguration="" name="mexStream" 
                  contract="IMetadataExchange"/>
      </service>
    </services>
    <!-- BINDINGS -->
    <bindings>
      <basicHttpBinding>
        <binding name="httpLargeMessageStream" 
                 maxReceivedMessageSize="2147483647" 
                 maxBufferPoolSize="2147483647"
                 maxBufferSize="2147483647" 
                 transferMode="Streamed"/>
      </basicHttpBinding>
    </bindings>

感谢您的帮助!

斯特凡诺

3 个答案:

答案 0 :(得分:7)

当我将传输模式从Streamed更改为StreamedResponse时,一切都开始起作用了,如下所示:

binding.TransferMode = TransferMode.StreamedResponse;

我仍然不明白为什么会这样,Streamed没有,为什么我能够从服务器发送和接收文件流。

答案 1 :(得分:5)

ASP.NET开发服务器不支持流模式。您需要将服务部署到IIS(或WCF服务应用程序)以使用流模式。

答案 2 :(得分:1)

尝试在bining标记中添加messageEncoding =“Mtom”。