當嘗試從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"));
爲我的應用程序使用端口8080-8085,它的工作原理,技術上你不使用System.Net.Sockets(限於端口4502-4534),而是HTTP,我認爲問題在於其他地方,你應該看看它在你最不期待的時候再次彈出它 – Neil 2010-01-03 08:40:35
當我使用普通的HTTP時,我也能夠使用更廣泛的套接字。但這是我第一次嘗試使用'pollingDuplexHttpBinding'。我很確定,改變端口號是我在事情開始工作之前做出的唯一修改,所以也許限制適用於該綁定。你以前用過雙工HTTP綁定的高端口號嗎? – Jacob 2010-01-03 10:26:23
@Neil:你的XAP文件是否從每個機會的端口8080-8085上的同一個http服務器上傳遞?對XAP始發的端口沒有限制,並且從XAP到該端口上的服務器的任何其他HTTP訪問都將被視爲同一站點訪問。 – AnthonyWJones 2010-01-03 15:19:48