2017-07-14 13 views
0

ステートレスサービスとWeb APIを使用して基本的なサービスファブリックソリューションをセットアップし、デフォルトのサービスリモートリスナーを使用してすべてが動作することをテストしました。幸せな日々!サービスファブリック異なるContractDescriptionを持つ複数のServiceEndpoint

デフォルトのリスナーをサービスバスリレー(サービスとの通信方法)に置き換えると、起動時にエラーが発生します。

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> 

私はリスナーの作成中に壊れた場合、私はそれが2つのサービス・エンドポイントの作成です参照してください。

enter image description here

最終的に、このエラーはService Fabric Explorerの各ノードに表示されます。

不健全なイベント:SourceId = 'System.RA'、プロパティ= 'ReplicaOpenStatus'、HealthState = '警告'、ConsiderWarningAsError = false。レプリカに複数の失敗in_Node_1 API呼び出しがありました:IStatelessServiceInstance.Open(); Error = System.InvalidOperationException(-2146233079)Serviceには、Name = 'ICommercial'およびNamespace = 'http://[schema_path]/20170713'の異なるContractDescriptionsを持つ複数のServiceEndpointが含まれています。一意の名前と名前空間を持つContractDescriptionsを提供するか、ServiceEndpointsが同じContractDescriptionインスタンスを持つことを確認します。 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescriptionの記載、ServiceHostBaseのServiceHostでSystem.ServiceModel.Description.DispatcherBuilder.ValidateDescription(ServiceDescriptionの記載、ServiceHostBaseのServiceHost)でSystem.ServiceModel.Dispatcher.UniqueContractNameValidationBehavior.Validate(ServiceDescriptionの記載、ServiceHostBase serviceHostBase)でSystem.ServiceModel.ServiceHostBase.OnBeginOpen(TimeSpanタイムアウト、AsyncCallbackコールバック、オブジェクト状態)のSystem.ServiceModel.ServiceHostBase.InitializeRuntime()で、System.ServiceModel.ServiceHostBase.InitializeRuntime()でSystem.ServiceModel.Channels.CommunicationObject.OpenAsyncResult.InvokeOpen()を呼び出します。 Microsoft.ServiceFabric.Services.CommunicationのSystem.ServiceModel.Channels.CommunicationObject.BeginOpen(TimeSpanタイムアウト、AsyncCallbackコールバック、オブジェクト状態)のCommunicationObject.OpenAsyncResult..ctor(CommunicationObject communicationObject、TimeSpanタイムアウト、AsyncCallbackコールバック、オブジェクト状態) .Wcf.Runtime.WcfCommunicationListener`1.Microsoft.ServiceFabric.Services.Communication.Runtime.ICommunicationListener.OpenAsync(CancellationToken cancellationToken)at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.d__20.MoveNext()---スタックトレースの終了位置例外がスローされた以前の場所--- Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.d__14.MoveNextのSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()、System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク) )

私は、「ContractDescriptionsに一意の名前と名前空間を提供するか、ServiceEndpointsが同じContractDescriptionインスタンスを持つか」をどのように修正するかを明確にはっきりしていません。

答えて

0

endpointResourceNameは、ServiceManifestファイル内で指定したエンドポイントを明確に指す必要があります。とにかくapp.configもここで動作するのかどうかはわかりません... app.confingを使用するWCFリスナを使ったSFの例はありますか?この良い例をチェックして、コードに必要な設定(ServiceFabric.WcfCalc)を設定してください。うまくいけば助けになると思う。

+0

作成したリスナーから、app.configで設定されたリスナーを作成していることがわかります。私が推測する質問は、2番目のデフォルトのnet.tcpリスナーが作成される理由です(メインポストの画像を参照)。このため、エラーが発生しています。 – ConfusedMonkey

+0

@ConfusedMonkey私のマシン上で問題を再現したのですが、2つのエンドポイントを持っているのはこれです - 最初のエンドポイントはapp.configファイルから作成され、2つ目はSFによってマニフェストファイルから構築され、あなたのサービスはSF Naming Serviceでどのように解決され、知られているのでしょうか。だから私はあなたがあなたのwcfリスナを作成するときに、上記の記事を見て、コードに必要な設定をすべて行うことをお勧めします。 –

+0

@ConfusedMonkey SF - [サービスバスリレーバインディングのためのAzureサービスファブリックリスナーの設定](https://stackoverflow.com/questions/43055785/setup-a)にwcfリレーリスナーを設定する方法を正確に示す投稿があるようです。 -azure-service-fabric-listener-for-service-bus-relay-binding)を使用します。 –

関連する問題