WCF流:仅在net.tcp中出现帧模式错误



我有一个应用程序服务器,它使用默认的transferMode="Buffered"和一个Streamed服务来实现一组服务。它公开了basicHttpnet.tcp协议的端点,并在数十种IIS 7.0+配置下正常运行。

当我去为一个新应用程序的服务器复制体系结构时,通过net.tcp的流传输根本不起作用,抛出了完全不透明和迟钝的ProtocolException

MyNetTcpEndpointAddress不支持正在使用的网络帧模式。有关更多详细信息,请参阅服务器日志。

是的,没错,"服务器日志"。(无论是否跟踪,都没有。)除了之外,S1和S2的服务架构和web.config是相同的

  • 一些名称更改
  • S2中的自定义命名空间(S1使用tempuri)
  • 不同的端口(S1和S2都使用8000-9000范围内的端口)

流媒体服务S2在basicHttp下运行良好。

在尝试了所有方法但都未能消除错误后,我构建了一个测试客户端,它只使用一些Ping方法运行我的服务体系结构。没有自定义的名称空间,没有多余的东西,只有原始的配置,以及围绕ChannelFactory代理的精简服务、契约和手工编码的包装器。

相同错误:

。"Net"不支持正在使用的Net Framing模式。tcp://localhost:9931/StreamingService.svc"。有关更多详细信息,请参阅服务器日志。

缓冲测试服务在两种协议下都工作,流式服务在basicHttp下工作,如S2中所示。

所有测试都是在同一台Win7计算机上完成的,并具有完整的IIS设置。测试应用程序仍然太大,无法在这里发布,但以下是完整的配置和控制台代码

web.config

<configuration>
<connectionStrings>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<!-- throttling of stream size is partially controlled by this setting -->
<httpRuntime maxRequestLength="1048576" /><!-- 1GB -->
</system.web>
<system.serviceModel>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="FooService.svc" service="WcfTest.Services.FooService" />
<add relativeAddress="StreamingService.svc" service="WcfTest.Services.StreamingService" />
</serviceActivations>
</serviceHostingEnvironment>
<behaviors>
<serviceBehaviors>
<behavior>
<dataContractSerializer maxItemsInObjectGraph="200000" />
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding
openTimeout="00:20:00" sendTimeout="00:20:00" receiveTimeout="00:20:00" closeTimeout="00:20:00"
maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000">
<readerQuotas maxStringContentLength="12000" />
</binding>
<binding name="WcfTest.Streaming.Http" transferMode="Streamed"
openTimeout="03:00:00" sendTimeout="03:00:00" receiveTimeout="03:00:00" closeTimeout="03:00:00"
maxReceivedMessageSize="1073741824" /><!-- 1GB -->
</basicHttpBinding>
<netTcpBinding>
<binding
openTimeout="00:20:00" sendTimeout="00:20:00" receiveTimeout="00:20:00" closeTimeout="00:20:00"
maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000">
<readerQuotas maxStringContentLength="12000" />
</binding>
<binding name="WcfTest.Streaming.Tcp" transferMode="Streamed"
openTimeout="03:00:00" sendTimeout="03:00:00" receiveTimeout="03:00:00" closeTimeout="03:00:00"
maxReceivedMessageSize="1073741824"><!-- 1GB -->
</binding>
</netTcpBinding>
</bindings>
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" />
<add scheme="net.tcp" binding="netTcpBinding"/>
</protocolMapping>
<services>
<service name="WcfTest.Services.Streaming">
<!-- http -->
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="WcfTest.Streaming.Http" contract="WcfTest.Contracts.IStreamingService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<!-- net.tcp -->
<endpoint address="" binding="netTcpBinding" bindingConfiguration="WcfTest.Streaming.Tcp" contract="WcfTest.Contracts.IStreamingService" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>

app.config

<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior>
<dataContractSerializer maxItemsInObjectGraph="200000"/>
</behavior>
<behavior name="customQuotaBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding
openTimeout="00:20:00" sendTimeout="00:20:00" receiveTimeout="00:20:00" closeTimeout="00:20:00"
maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000">
<readerQuotas maxStringContentLength="12000" />
</binding>
<binding name="WcfTest.Bindings.Streaming.Http" transferMode="Streamed"
openTimeout="03:00:00" sendTimeout="03:00:00" receiveTimeout="03:00:00" closeTimeout="03:00:00"
maxReceivedMessageSize="1073741824"><!-- 1GB -->
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding
openTimeout="00:20:00" sendTimeout="00:20:00" receiveTimeout="00:20:00" closeTimeout="00:20:00"
maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000">
<readerQuotas maxStringContentLength="12000" />
</binding>
<binding name="WcfTest.Bindings.Streaming.Tcp" transferMode="Streamed"
openTimeout="03:00:00" sendTimeout="03:00:00" receiveTimeout="03:00:00" closeTimeout="03:00:00"
maxReceivedMessageSize="1073741824"><!-- 1GB -->
</binding>
</netTcpBinding>
</bindings>
<client>
<!-- Foo -->
<endpoint name="WcfTest.Endpoints.Foo.Http" address="http://localhost:9930/FooService.svc" binding="basicHttpBinding" contract="WcfTest.Contracts.IFooService" />
<endpoint name="WcfTest.Endpoints.Foo.Tcp" address="net.tcp://localhost:9931/FooService.svc" binding="netTcpBinding" contract="WcfTest.Contracts.IFooService" />
<!-- Streaming -->
<endpoint name="WcfTest.Endpoints.Streaming.Http" address="http://localhost:9930/StreamingService.svc" binding="basicHttpBinding" bindingConfiguration="WcfTest.Bindings.Streaming.Http" contract="WcfTest.Contracts.IStreamingService" />
<endpoint name="WcfTest.Endpoints.Streaming.Tcp" address="net.tcp://localhost:9931/StreamingService.svc" binding="netTcpBinding" bindingConfiguration="WcfTest.Bindings.Streaming.Tcp" contract="WcfTest.Contracts.IStreamingService" />
</client>
</system.serviceModel>
</configuration>

控制台测试调用

static void Main(string[] args)
{
Console.WriteLine("starting WcfTest client...");
Console.WriteLine();
PingFoo(Contracts.Enums.Protocol.Http);
PingFoo(Contracts.Enums.Protocol.Tcp);
Console.WriteLine();
PingStreaming(Contracts.Enums.Protocol.Http);
// only this call errors:
PingStreaming(Contracts.Enums.Protocol.Tcp);
Console.WriteLine();
Console.Write("ENTER to exit WcfTest client...");
Console.ReadLine();
}
private static bool PingFoo(Contracts.Enums.Protocol protocol)
{
FooProxy pxy = new FooProxy(protocol);
return PingProxy<IFooService>(pxy, protocol);
}
private static bool PingStreaming(Contracts.Enums.Protocol protocol)
{
StreamingProxy pxy = new StreamingProxy(protocol);
return PingProxy<IStreamingService>(pxy, protocol);
}
private static bool PingProxy<T>(ProxyServiceBase<T> pxy, Contracts.Enums.Protocol protocol) where T : IServiceBase
{
bool success = pxy.Ping(); 
Console.WriteLine("ping {0} {1}: {2}", pxy.GetType().Name, protocol, success ? " success" : " FAILED");
if (pxy != null)
pxy.Close();
return success;
}

有什么想法吗?为什么在两种协议中的一种协议下,这在一个IIS网站上会失败,而在另一个协议上却不会?(不是这个。)

编辑:在准备接受这笔奖金时,对该测试服务和客户进行了一些澄清:

首先,根据评论者的建议,svcutil对http运行良好,但对net.tcp运行失败

svcutil网tcp://localhost:9931/StreamingService.svcMicrosoft(R)服务模型元数据工具[Microsoft(R)Windows(R)CommunicationFoundation,3.0.4506.2152]版权所有(c)Microsoft公司保留所有权利。

正在尝试从下载元数据’net。tcp://localhost:9931/StreamingService.svc'使用WS-Metadata交换此UR L不支持DISCO。Microsoft(R)服务模型元数据工具[Microsoft(R)Windows(R)CommunicationFoundation,3.0.4506.2152]版权所有(c)Microsoft公司保留所有权利。

错误:无法从中获取元数据网tcp://localhost:9931/StreamingService.svc

如果这是您要访问的Windows(R)Communication Foundation服务具有访问权限,请检查您是否已启用元数据发布在指定的地址。为了帮助实现元数据发布,请参阅MSDN文档,网址为http://go.microsoft.com/fwlink/?LinkId=65455.

WS元数据交换错误URI:net。tcp://localhost:9931/StreamingService.svc

元数据包含无法解析的引用:"net。tcp://localhost:9931/StreamingService.svc"。

套接字连接已中止。这可能是由于处理您的消息时出错,或者接收超时超过远程主机或潜在的网络资源问题。本地插座超时为"00:04:59.992993"。

远程主机强制关闭了现有连接

如果需要更多帮助,请键入"svcutil/?">

其次,从上面粘贴的Wcf.Bindings.Streaming.Tcpweb和应用程序配置中删除"transferMode="Streamed"可以让服务正常ping。它不会改善svcutil的情况。

最后,以下是我尝试过的其他一些东西,但没有改进:

  • serviceBehaviorsserviceMetadata属性的各种版本(据我所知,无论如何都会被mex端点的存在所覆盖)
  • 包括各种命名的serviceBehaviors而不是默认的
  • security mode=在结合上的各种配置,尤其是None
  • 对所有其他绑定、端点等进行各种禁用,希望一件事会妨碍另一件事

似乎将tcp通信的模式在服务端或客户端转移到Streamed,而另一端仍然使用默认模式Buffered。

在TCP的情况下,您是否忘记了"StreamingProxy"中的某些内容?

也许这会有所帮助。。。http://social.msdn.microsoft.com/Forums/vstudio/en-US/37e32166-63f3-4cb9-ab81-14caa50cd91e/help-with-error-message-the-net-framing-mode-being-used-is-not-supported-by-?forum=wcf

此外,我正在进一步寻找您的解决方案。。。

相关内容

  • 没有找到相关文章

最新更新