1

當嘗試從Silverlight 3調用WCF服務時,我得到了一個無用的CommunicationException。異常的消息是「遠程服務器返回了一個錯誤:NotFound。」。每個內部異常鸚鵡同樣的消息。我的設置有問題可能導致此問題?在Silverlight 3中接收NotFound CommunicationException WCF客戶端

這是我的設置。 WCF服務託管在.NET 4.0平臺上運行的Windows服務中。它有三個端點:

  • 主要終點使用pollingDuplexHttpBinding結合並具有地址「DashboardService」
  • 元數據交換終結點使用mexHttpBinding結合並具有地址「MEX」
  • 提供端點策略(這需要允許跨域調用)使用webHttpBinding綁定並具有地址「」。

這裏是整個system.serviceModel部分:

<system.serviceModel> 
    <extensions> 
     <bindingExtensions> 
     <add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     </bindingExtensions> 
    </extensions> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="PolicyProviderBehavior"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <services> 
     <service name="RoboTrader.TheFloor.DashboardService"> 
     <endpoint address="" binding="webHttpBinding" 
      behaviorConfiguration="PolicyProviderBehavior" 
      contract="RoboTrader.DashboardService.IPolicyProvider"/> 
     <endpoint address="DashboardService" binding="pollingDuplexHttpBinding" 
      contract="RoboTrader.DashboardService.IDashboardService"/> 
     <endpoint address="DashboardService/mex" binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8732/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
</system.serviceModel> 

在Silverlight客戶端代碼,我添加了一個服務引用,這似乎只是正常工作。客戶端按預期提取服務上的跨域策略。但是,當我調用主DashboardService方法時,我得到CommunicationException,並且我的服務器端方法中的斷點永遠不會到達。以下是通過添加服務引用生成的Silverlight ClientConfig文件:

<system.serviceModel> 
    <bindings> 
     <customBinding> 
      <binding name="PollingDuplexHttpBinding_IDashboardService"> 
       <binaryMessageEncoding /> 
       <httpTransport maxReceivedMessageSize="2147483647" 
        maxBufferSize="2147483647" /> 
      </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8732/DashboardService" 
      binding="customBinding" 
      bindingConfiguration="PollingDuplexHttpBinding_IDashboardService" 
      contract="Service.IDashboardService" 
      name="PollingDuplexHttpBinding_IDashboardService" /> 
    </client> 
</system.serviceModel> 

是否有與此設置的任何問題,或是否有任何額外的事情,我需要做的就是輪詢雙工HTTP綁定工作?或者你是否至少知道如何才能獲得有關問題的更多信息?

編輯:

我只是試圖建立通過代碼在客戶端和服務器綁定,而不是看它是否會有所幫助,但我仍然得到相同的異常。這裏的服務器代碼:

var dboardService = new DashboardService(); 
ServiceHost host = new ServiceHost(dboardService); 
host.AddServiceEndpoint(
    typeof(IDashboardService), 
    new CustomBinding(
     new PollingDuplexBindingElement(), 
     new BinaryMessageEncodingBindingElement(), 
     new HttpTransportBindingElement()), 
    "DashboardService"); 
host.Open(); 

而這裏的客戶端代碼:

private IDashboardService _svc = new DashboardServiceClient(
    new PollingDuplexHttpBinding(), 
    new EndpointAddress("http://localhost:8732/DashboardService")); 

編輯2:

我試圖改變客戶端代碼這一點,但出現了同樣的問題:

private IDashboardService _svc = new DashboardServiceClient(
    new CustomBinding(
     new PollingDuplexBindingElement(), 
     new BinaryMessageEncodingBindingElement(), 
     new HttpTransportBindingElement()), 
    new EndpointAddress("http://localhost:8732/DashboardService")); 

回答

1

你一定是在開玩笑吧!我發現爲什麼這不是一個MSDN文章,題爲Network Security Access Restrictions in Silverlight在工作的原因:

One additional restriction on using the sockets classes is that the destination port range that a network application is allowed to connect to must be within the range of 4502-4534."

改變我的端口號4505之後,服務器代碼是使Silverlight的請求後達成。

+1

爲我的應用程序使用端口8080-8085,它的工作原理,技術上你不使用System.Net.Sockets(限於端口4502-4534),而是HTTP,我認爲問題在於其他地方,你應該看看它在你最不期待的時候再次彈出它 – Neil 2010-01-03 08:40:35

+0

當我使用普通的HTTP時,我也能夠使用更廣泛的套接字。但這是我第一次嘗試使用'pollingDuplexHttpBinding'。我很確定,改變端口號是我在事情開始工作之前做出的唯一修改,所以也許限制適用於該綁定。你以前用過雙工HTTP綁定的高端口號嗎? – Jacob 2010-01-03 10:26:23

+1

@Neil:你的XAP文件是否從每個機會的端口8080-8085上的同一個http服務器上傳遞?對XAP始發的端口沒有限制,並且從XAP到該端口上的服務器的任何其他HTTP訪問都將被視爲同一站點訪問。 – AnthonyWJones 2010-01-03 15:19:48

0

嘗試通過代碼創建端點,完全是s你現在正在做這件事。 但在客戶端創建代理就像這樣。

CustomBinding binding = new CustomBinding(
       new PollingDuplexBindingElement(), 
       new BinaryMessageEncodingBindingElement(), 
       new HttpTransportBindingElement()); 


private IDashboardService _svc = new DashboardServiceClient(binding, 
    new EndpointAddress("http://localhost:8732/DashboardService")); 
+0

我試過了,得到了同樣的結果。 – Jacob 2010-01-02 20:04:55