C# 以编程方式配置WCF流媒体服务的错误响应(400)
这是我第一次尝试将流媒体用于WCF,而我正在与可怕的“远程服务器返回意外响应:(400)错误请求”响应作斗争 跟踪查看器表示这是System.ServiceModel.ProtocolException,消息为“从网络接收的XML有问题。有关详细信息,请参阅内部异常。”内部异常类型表示“无法读取消息体,因为它是空的。” 在其他条件不变的情况下,如果我在客户端切换到缓冲模式,我就能够调试到服务器代码中 出于某些原因,我必须以编程方式配置我的服务,如下所示:C# 以编程方式配置WCF流媒体服务的错误响应(400),c#,wcf,soap,streaming,C#,Wcf,Soap,Streaming,这是我第一次尝试将流媒体用于WCF,而我正在与可怕的“远程服务器返回意外响应:(400)错误请求”响应作斗争 跟踪查看器表示这是System.ServiceModel.ProtocolException,消息为“从网络接收的XML有问题。有关详细信息,请参阅内部异常。”内部异常类型表示“无法读取消息体,因为它是空的。” 在其他条件不变的情况下,如果我在客户端切换到缓冲模式,我就能够调试到服务器代码中 出于某些原因,我必须以编程方式配置我的服务,如下所示: public IUniverse
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>
binding.TransferMode = TransferMode.StreamedResponse;
public IUniverseFileService OpenProxy(字符串服务URL)
{
Assert(!string.IsNullOrEmpty(serviceUrl));
var binding=新的BasicHttpBinding();
binding.Name=“basicHttpStream”;
binding.MaxReceivedMessageSize=1000000;
binding.TransferMode=TransferMode.Streamed;
var channelFactory=
新渠道工厂(
结合
新端点地址(serviceUrl));
返回channelFactory.CreateChannel();
}
而服务器的配置如下所示:
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>
binding.TransferMode = TransferMode.StreamedResponse;
我感谢你的帮助
Stefano当我将传输模式从
Streamed
更改为StreamedResponse
时,一切都开始工作,如下所示:
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>
binding.TransferMode = TransferMode.StreamedResponse;
但我仍然不明白为什么这样做有效而流式处理无效,以及为什么我可以从服务器发送和接收文件流。尝试在bining标记中添加messageEncoding=“Mtom”。ASP.NET development server不支持流式处理模式。您需要将服务部署到IIS(或WCF服务应用程序)才能使用流模式 请在你的帖子里。我最初也有同样的问题。事实上,不管怎样,我所需要的只是回应。对我来说也很有效。只花了我7小时