如果我第一次尝试使用流媒体进行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>
感谢您的帮助!
斯特凡诺
答案 0 :(得分:7)
当我将传输模式从Streamed
更改为StreamedResponse
时,一切都开始起作用了,如下所示:
binding.TransferMode = TransferMode.StreamedResponse;
我仍然不明白为什么会这样,Streamed
没有,为什么我能够从服务器发送和接收文件流。
答案 1 :(得分:5)
ASP.NET开发服务器不支持流模式。您需要将服务部署到IIS(或WCF服务应用程序)以使用流模式。
答案 2 :(得分:1)
尝试在bining标记中添加messageEncoding =“Mtom”。