0

我已经创建了 wcf 应用程序:这个合同:

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);
        }
}
}

这是 App.config

  <?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>

在地址添加服务引用后:“http://117.5.36.172:23000/FileTranfer”我运行服务正常。创建后:

ServiceReference1.Service1Client 客户端 = new ServiceReference1.Service1Client();

                Console.WriteLine(client.State); ====> return Created
                Console.WriteLine(client.GetData(5)); ==>Not return value, seems 

这不是访问。我打开防火墙端口 23000 并添加转发端口路由器。请帮助我谢谢大家

4

1 回答 1

0

WSDualHttpBinding 和大多数人连接到 Internet 的方式存在一个真正的问题——正如您已经发现的那样,至少对于 IPv4,位于路由器后面意味着让 NAT 毁了聚会。

使用 WSDualHttpBinding,您有两个连接:从客户端到服务器,以及从服务器到客户端。

通常,客户端到服务器的连接没什么大不了的——大多数通信都是通过互联网完成的。在您的情况下,您似乎位于防火墙后面,并且您已经打开/转发了所需的端口。但这并不能解决第二个连接的问题——从服务器到客户端。基本上,第二个连接发生的情况是客户端充当服务器,而服务器充当客户端。因此,您需要对连接到您的服务的每个客户端进行相同的端口打开/转发,因为它也充当服务器!这当然是对您服务的每一位用户提出的不合理要求。这就是为什么 WSDualHttpBinding 更适合服务器到服务器的通信,其中设置是一次性的。

我建议您切换到 NetTcpBinding,而不是试图让 WSDualHttpBinding 工作。由于 WSDualHttpBinding 和 NetTcpBinding 都是 WCF-only、Microsoft-only、专有连接方案,因此您不会在互操作性方面损失太多。另一方面,你得到的是很多:

NetTcpBinding 仅使用从客户端到服务器的单一连接,同时允许像 WSDualHttpBinding 那样的两种方式通信。因此,无需在客户端处理端口打开/转发 - NAT 不是问题。通信协议是二进制的,比 WSDualHttpBinding 中使用的纯文本 XML 更紧凑。更少的数据传输意味着更好的服务。使用 NetTcpBinding,您可以在客户端断开连接时获得即时通知,因为套接字已关闭。无需像使用 WSDualHttpBinding 那样等待 HTTP 超时。单个连接意味着没有任何东西可以不同步 - 使用 WSDualHttpBinding,两个连接中的一个可能会断开,而另一个可能仍然处于活动状态,只有一种方式通信。WCF 有办法解决这个问题,但它'

切换到 NetTcpBinding 通常只需要更改配置 - 代码保持不变。它很简单,速度很快,不那么麻烦,最重要的是 - 它可以工作。

感谢使用 wsDualHttpBinding 通过 Internet 连接到 WCF 服务超时

于 2012-06-14T07:44:06.940 回答