WCF 轮询双工绑定和非 Silverlight 客户端

Posted

技术标签:

【中文标题】WCF 轮询双工绑定和非 Silverlight 客户端【英文标题】:WCF Polling Duplex Binding and Non-Silverlight Clients 【发布时间】:2011-05-05 17:55:45 【问题描述】:

我花了很长时间才弄清楚这一点。我有一个 WCF 服务,我需要向 Silverlight 客户端发送信息,但我需要一个控制台应用程序才能参与其中。谁能给我一个关于我的 Web.Config 应该是什么样子的提示,以指定控制台应用程序可以访问的附加绑定?当我认为我的工作正常时,SL 客户端无法接收任何消息......

这是我当前的 Web.Config:

<?xml version="1.0"?>

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <extensions>
      <bindingExtensions>
        <add name="pollingDuplex" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions>

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <!-- Create the polling duplex binding. -->
    <bindings>
      <pollingDuplex>
        <binding name="myPollingDuplex"
                 duplexMode="MultipleMessagesPerPoll">
        </binding>
      </pollingDuplex>
    </bindings>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name ="EdiManager.Web.EdiPubSub">
        <endpoint address=""
                  binding="pollingDuplex"
                  bindingConfiguration="myPollingDuplex"
                  contract="EdiManager.Web.EdiPubSub"
                  />
        <endpoint address="mex" 
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
      </service>
    </services>
    </system.serviceModel>
</configuration>

【问题讨论】:

【参考方案1】:

如果您不需要全双工,只需使用 wsHttpBinding 而不是 mex(或提供更多信息您想要实现的目标)。

【讨论】:

我知道这是我需要做的。问题是当我添加一个新端点时,Silverlight 客户端听不见了,所以我希望有人可以展示如何创建端点。我不知道我做错了什么。但我正在手动编辑配置。周六,当我再次尝试时,我使用了 WCF 服务编辑器,它运行良好。所以我只能把这归咎于我缺乏技能!不过,感谢您的建议。【参考方案2】:

您是否希望控制台应用程序也参与轮询双工连接?还是您想使用不同的查询-响应绑定?

另外,我注意到您将 AspNetCompatibility 与轮询双工结合使用。如果您正在访问会话状态,您将遇到一些性能问题。我对它做了一个short blog post,它引用了一个带有测试信息的MSDN blog post。

简而言之,轮询双工是一个长时间超时的操作。会话状态锁定,并且在轮询超时和建立另一个再次锁定会话状态提供程序的连接之前,没有其他请求可以继续。

【讨论】:

谢谢,埃里克。你的博文很有趣。【参考方案3】:

我能够通过使用 WCF 服务编辑器编辑配置而不是手动操作来使其工作。显然我在手动编辑配置时犯了一些错误。这是有效的 web.config:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <extensions>
      <bindingExtensions>
        <add name="pollingDuplex" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions>

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <!-- Create the polling duplex binding. -->
    <bindings>
      <wsDualHttpBinding>
        <binding name="myDualHttp" />
      </wsDualHttpBinding>
      <pollingDuplex>
        <binding name="myPollingDuplex" duplexMode="MultipleMessagesPerPoll" />
      </pollingDuplex>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="EdiManager.Web.EdiPubSub">
        <endpoint address="Silverlight" binding="pollingDuplex" bindingConfiguration="myPollingDuplex"
          name="Silverlight" contract="EdiManager.Web.EdiPubSub" />
        <endpoint address="Console" binding="wsDualHttpBinding" bindingConfiguration="myDualHttp"
          name="Console" contract="EdiManager.Web.EdiPubSub" />
      </service>
    </services>
    </system.serviceModel>
</configuration>

【讨论】:

以上是关于WCF 轮询双工绑定和非 Silverlight 客户端的主要内容,如果未能解决你的问题,请参考以下文章

带有 Silverlight 4 轮询双工的 StreamedResponse 不发送更新

WCF - 使用 NetHttpBinding(WebSockets) 或替代双工绑定发送 JSON

Silverlight WCF 超时

在双工绑定 WCF 应用程序中处理丢弃的客户端

WCF:OneWay OperationContract 上的异常处理

如何修复 HTTPS Silverlight 应用程序上下文中的 WCF maxClockSkew 问题?