2017-07-14 93 views
0

我已經使用無狀態服務和Web API設置了基本的Service Fabric解決方案,並測試了使用默認服務遠程處理偵聽器的所有功能。快樂的時光!具有不同ContractDescriptions的服務結構多個ServiceEndpoints

當我嘗試用服務總線中繼替換默認偵聽器時(我打算如何與服務進行通信),我在啓動時收到錯誤。

CreateServiceInstanceListeners()

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
{ 
    return new[] { 
     new ServiceInstanceListener(context => { 
      var wcfRelay = new WcfCommunicationListener<ICommercial>(
       wcfServiceObject: this, 
       serviceContext: context, 
       endpointResourceName: "serviceRelay"); 

      return wcfRelay; 
     }) 
    }; 
} 

服務配置(app.config)中

<system.serviceModel> 
    <extensions>…</extensions> 
    <services> 
     <service name="Commercial.Service.CommercialService"> 
     <endpoint address="http://[namespace].servicebus.windows.net/CommercialService" 
        name="serviceRelay" 
        binding="basicHttpRelayBinding" 
        contract="Commercial.Interface.ICommercial" 
        behaviorConfiguration="relayToken" /> 
     </service> 
    </services> 
    <bindings> 
     <basicHttpRelayBinding> 
     <binding closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" maxBufferSize="5886800" maxBufferPoolSize="524288" maxReceivedMessageSize="5886800" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="5886800" maxArrayLength="5886800" maxBytesPerRead="5886800" maxNameTableCharCount="16384" /> 
     </binding> 
     </basicHttpRelayBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="relayToken"> 
      <transportClientEndpointBehavior> 
      <tokenProvider> 
       <sharedAccessSignature keyName="RootManageSharedAccessKey" key="[key]" /> 
      </tokenProvider> 
      </transportClientEndpointBehavior> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 

如果我在聽者創造打破我看到它的創建兩個服務端點:

enter image description here

最終我得到這個錯誤,顯示了Service Fabric Explorer中的每個節點。

不健康事件:SourceId ='System.RA',Property ='ReplicaOpenStatus',HealthState ='Warning',ConsiderWarningAsError = false。副本有多個失敗in_Node_1 API調用:IStatelessServiceInstance.Open(); Error = System.InvalidOperationException(-2146233079)服務包含多個具有不同ContractDescriptions的ServiceEndpoint,每個具有Name ='ICommercial'和Namespace ='http://[schema_path]/20170713'。可以爲ContractDescription提供唯一的名稱和名稱空間,或確保ServiceEndpoint具有相同的ContractDescription實例。 System.ServiceModel.Dispatcher.UniqueContractNameValidationBehavior.Validate(ServiceDescription description,ServiceHostBase serviceHostBase)at System.ServiceModel.Description.DispatcherBuilder.ValidateDescription(ServiceDescription description,ServiceHostBase serviceHost)at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description,ServiceHostBase serviceHost )在System.ServiceModel.ServiceHostBase.InitializeRuntime()System.ServiceModel.ServiceHostBase.OnBeginOpen(TimeSpan超時,AsyncCallback回調,對象狀態)在System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult.InvokeOpen()在System.ServiceModel.Channels。在Microsoft.ServiceFabric.Services.Communication System.ServiceModel.Channels.CommunicationObject.BeginOpen(TimeSpan超時,AsyncCallback回調,對象狀態)CommunicationObject.OpenAsyncResult..ctor(CommunicationObject通信對象,TimeSpan超時,AsyncCallback回調,對象狀態) 。Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.d__20.MoveNext()中的.Wcf.Runtime.WcfCommunicationListener`1.Microsoft.ServiceFabric.Services.Communication.Runtime.ICommunicationListener.OpenAsync(CancellationToken cancellationToken)之前引發異常的位置---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.d__14.MoveNext( )

我不完全清楚如何解決此問題「要麼爲ContractDescriptions提供唯一的名稱和名稱空間,要麼確保ServiceEndpoint具有相同的ContractDescription實例」。

回答

0

endpointResourceName應該明確指向您在ServiceManifest文件中指定的端點。無論如何,我甚至不確定app.config甚至可以在這裏工作......你看過使用app.confing的WCF偵聽器的任何SF示例嗎?查看這個很好的示例,在代碼中配置所需的設置 - ServiceFabric.WcfCalc。希望這會有所幫助。

+0

我可以從創建的偵聽器看到它正在創建在app.config中配置的偵聽器。我想這個問題是爲什麼創建第二個默認的net.tcp監聽器(請參閱主文章中的圖片)。這就是錯誤產生的原因。 – ConfusedMonkey

+0

@ConfusedMonkey在我的機器上覆制了你的問題後,我會說你有兩個端點的原因是這樣的 - 第一個端點是從你的app.config文件創建的,第二個端點是由你的清單文件中的SF構建的,這就是您的服務將在SF命名服務中得到解決和了解的方式。所以我仍然建議看看我上面發佈的文章,並在創建wcf監聽器時在代碼中完成所有必需的配置。 –

+0

@ConfusedMonkey好像有一個帖子,顯示瞭如何配置SF中的中繼監聽器 - [爲服務總線中繼綁定安裝Azure服務結構監聽器](https://stackoverflow.com/questions/43055785/setup-a -azure服務織物偵聽換服務總線中繼結合)。 –

相關問題