none
Silverlight + pollingDuplexHttpBinding RRS feed

  • 问题

  • 请问有朋友成功尝试了 MSDN 上的 How to: Build a Duplex Service for a Silverlight Client 吗?

    http://msdn.microsoft.com/en-us/library/cc645027(VS.95).aspx

    按照所有步骤操作下来,但 Web.config 配置节点:

      <bindings>
       <pollingDuplexHttpBinding> 
        <binding name="multipleMessagesPerPollPollingDuplexHttpBinding" 
             duplexMode="MultipleMessagesPerPoll" 
             maxOutputDelay="00:00:07"/> 
       </pollingDuplexHttpBinding>
      </bindings>

     pollingDuplexHttpBinding 提示:

    The element 'bindings' has invalid child element 'pollingDuplexHttpBinding'. List of possible elements: 'basicHttpBinding,customBinding,......

    如果右击 Service1.svc 服务并 View in Browser ,刚网页上显示:

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.InvalidOperationException: Contract requires Duplex, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it.

    Server Error in '/' Application.

    Contract requires Duplex, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it.

     

    注:

    完全按照操作步骤去做,包括 System.ServiceModel.PollingDuplex.dll ,自己估计可能是少安装了什么,但 IIS7 已经安装了,包括最新的 RiaServices.msi ,Silverlight_4_Toolkit_April_2010.msi,Silverlight4_Tools.exe。

    环境:

    windows 7 , IIS 7, VS2010 英文版, SL 4。谢了!!!(本人新手,研究查阅许久仍没解决)

    cbingrui@gmail.com  

     

    2010年7月2日 5:19

答案

  • 谢了大哥!

    你的文件在我机子上测试也成功!

    后来通过对比终于发现由于我文件夹中已经存在 DuplexService 项目,所以我改为了 TestDuplexService 项目名称,所以 Web.config 配置文件中 :

      <services>
       <service name="TestDuplexService.OrderService">
    
        <!-- Service Endpoints -->
        <endpoint
          address=""
          binding="pollingDuplexHttpBinding"
          bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
          contract="TestDuplexService.IDuplexService">
        </endpoint>
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"/>
       </service>
      </services>
    有两片地方也要改为 TestDuplexService !!
    • 已标记为答案 bingrui 2010年7月4日 8:23
    2010年7月4日 8:22

全部回复

  • 这个教程确实有点问题,但修改其中的明显错误后,代码还是可以跑的。

    首先确认你引用了正确的程序集,按照教程所述,你应该引用%ProgramFiles%\Microsoft SDKs\Silverlight\v4.0\Libraries\Server\下的System.ServiceModel.PollingDuplex.dll,而不是Client\下的。

    然后直接拷贝教程中的完整system.serviceModel节代码(去掉末尾重复的):

    <system.serviceModel>
      <!-- Register the binding extension from the SDK. -->
      <extensions>
        <bindingExtensions>
          <add name="pollingDuplexHttpBinding"
                type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement,
                      System.ServiceModel.PollingDuplex, 
                      Version=4.0.0.0, 
                      Culture=neutral, 
                      PublicKeyToken=31bf3856ad364e35" />
        </bindingExtensions>
      </extensions>

      <!-- Create the polling duplex binding. -->
      <bindings>
        <pollingDuplexHttpBinding>
          <binding name="multipleMessagesPerPollPollingDuplexHttpBinding" duplexMode="MultipleMessagesPerPoll" maxOutputDelay="00:00:07"/>
        </pollingDuplexHttpBinding>
      </bindings>

      <services>
        <service name="DuplexService.OrderService">

          <!-- Service Endpoints -->
          <endpoint
              address=""
              binding="pollingDuplexHttpBinding"
              bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
              contract="DuplexService.IDuplexService">
          </endpoint>
          <endpoint
              address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange"/>
        </service>
      </services>


      <behaviors>
        <serviceBehaviors>
          <behavior>
            <!-- 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>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

    注意此时pollingDuplexHttpBinding节上确实会有错误提示,但其实没有问题。最后按教程完成其他代码文件,再View in Browser应该就可以了。

    我猜想你的问题是在service endpoint定义中没有加binding="pollingDuplexHttpBinding",而是用了默认的BasicHttpBinding.


    Tech Blog: http://gildor.cnblogs.com
    2010年7月2日 18:17
  • 感谢楼上的回复!

    首先,经过再次检查,的确是 Server\ 下的 System.ServiceModel.PollingDuplex.dll

    然后 Web.config 上的也与楼上一样(甚至用你的代码代替测试,结果仍有问题上的错误)。

    在其他外国网站上也有朋友问过相同问题,但仍没明确答复!

    (这里似乎没相关操作选项可以上传工程文件..可惜)

    2010年7月3日 4:58
  • 奇怪,我这里确实成功了的。
    Tech Blog: http://gildor.cnblogs.com
    2010年7月3日 15:45
  • 如果楼上方便,能否发测试成功的项目到我邮箱 cbingrui@gmail.com,谢!!

    我再重新检查下!

    2010年7月4日 0:46
  • 谢了大哥!

    你的文件在我机子上测试也成功!

    后来通过对比终于发现由于我文件夹中已经存在 DuplexService 项目,所以我改为了 TestDuplexService 项目名称,所以 Web.config 配置文件中 :

      <services>
       <service name="TestDuplexService.OrderService">
    
        <!-- Service Endpoints -->
        <endpoint
          address=""
          binding="pollingDuplexHttpBinding"
          bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
          contract="TestDuplexService.IDuplexService">
        </endpoint>
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"/>
       </service>
      </services>
    有两片地方也要改为 TestDuplexService !!
    • 已标记为答案 bingrui 2010年7月4日 8:23
    2010年7月4日 8:22
  • 跑成功了,但是请问,服务端对客户端有个回调操作,当客户端离线时服务端回调不到会造成服务端崩溃的问题你是怎么解决的
    stay hungry stay foolish
    2010年7月8日 5:53
  • 加了binding="pollingDuplexHttpBinding" 后,还是pollingDuplexHttpBinding节上有错误提示.

    不知道怎么回事.

    我是按照 msdn:如何:为 Silverlight 客户端生成双工服务

    来做的.

    2010年7月23日 8:23