namespace WcfServiceLibrary1 { [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); } }
namespace WcfServiceLibrary1 { public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } } }
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="2097151"
useFullyQualifiedRedirectUrl="true"
executionTimeout="144000" />
</system.web>
<system.serviceModel>
<!--<bindings>
<basicHttpBinding>
<binding name="FileTransferServicesBinding" transferMode="Streamed" messageEncoding="Mtom" maxReceivedMessageSize="2000000">
</binding>
</basicHttpBinding>
</bindings>-->
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IChatService" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00"
sendTimeout="00:03:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="104857600" maxReceivedMessageSize="104857600" messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true">
<readerQuotas maxDepth="104857600" maxStringContentLength="104857600" maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00"/>
<security mode="None">
<message clientCredentialType="None" negotiateServiceCredential="false" algorithmSuite="Default"/>
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<services>
<!--<service behaviorConfiguration="MyServiceTypeBehaviors" name="FileService.FileTransferService">
<endpoint address="mex" binding="basicHttpBinding" bindingConfiguration="FileTransferServicesBinding" contract="FileService.IFileTransferService"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/FileTranfer"/>
</baseAddresses>
</host>
</service>-->
<service behaviorConfiguration="MyServiceTypeBehaviors" name="WcfServiceLibrary1.Service1">
<endpoint address="mex" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IChatService" contract="WcfServiceLibrary1.IService1"/>
<host>
<baseAddresses>
<add baseAddress="http://117.5.36.172:23000/FileTranfer"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
Console.WriteLine(client.State); ====> return Created Console.WriteLine(client.GetData(5)); ==>Not return value, seems
答案 0 :(得分:0)
WSDualHttpBinding存在一个真正的问题,以及大多数人连接到互联网的方式 - 在路由器后面意味着,至少在IPv4中,NAT已经破坏了聚会,正如您已经发现的那样。
使用WSDualHttpBinding,您有两个连接:从客户端到服务器,从服务器到客户端。
通常,客户端到服务器的连接并不是什么大问题 - 这就是通过互联网进行大多数通信的方式。在您的情况下,您似乎是在防火墙后面,并且您已打开/转发所需的端口。但这并没有解决第二次连接的问题 - 从服务器到客户端。基本上,第二个连接发生的是客户端充当服务器,服务器充当客户端。因此,您需要为连接到您的服务的每个客户端执行相同的端口打开/转发,因为它还充当服务器!这对您服务的每个用户来说当然是一种无理要求。这就是为什么WSDualHttpBinding更适合服务器到服务器通信,其中设置是一次性事件。
我建议您切换到NetTcpBinding,而不是尝试让WSDualHttpBinding工作。由于WSDualHttpBinding和NetTcpBinding都是仅WCF,仅限Microsoft的专有连接方案,因此您在互操作性方面的损失并不大。另一方面,你获得的是很多:
NetTcpBinding仅使用从客户端到服务器的单个连接,同时允许双向通信,如WSDualHttpBinding。因此,无需在客户端处理端口打开/转发 - NAT不是问题。 通信协议是二进制的,比WSDualHttpBinding中使用的纯文本XML更紧凑。较少的数据传输意味着更好的服务。 使用NetTcpBinding,您可以立即获得客户端断开连接的通知,因为套接字已关闭。无需像使用WSDualHttpBinding一样等待HTTP超时。 单个连接意味着没有任何东西可以不同步 - 使用WSDualHttpBinding,两个连接中的一个可能会丢弃而另一个可能仍处于活动状态,只有一种通信方式。 WCF有办法解决这个问题,但最好首先避免这个问题。
切换到NetTcpBinding通常只需要更改配置 - 代码保持不变。它很简单,速度很快,不那么麻烦,最重要的是 - 它只是有效。
感谢Connecting over internet to WCF service using wsDualHttpBinding times out