WCF通信リスナーを使用して、AzureサービスファブリックのステートレスサービスにWCFを実行するAzure Webロールを移行しようとしています。すべて私のローカルサービスクラスターで動作します。 Azureに公開した後、クラスタ内の他のサービスはステートレスWCFサービスにアクセスできますが、外部(インターネット)クライアント(my devマシンを含む)は一時的なネットワークエラーで接続できません。外部クライアントがAzureサービスファブリックのWCF通信リスナーにアクセスできない
リソースグループ内のロードバランサにポート80と8080のルール/プローブがあり、TCPとHTTPでテスト済みであることを確認しました。また、WCFクライアント上のパーティションリゾルバをセットアップして、サービスクラスタ内の "クライアント接続エンドポイント"(デフォルトではサービスクラスタ内で動作する)をポイントしようとしました。
この時点では、構成上の問題があるかどうか、または外部(インターネット)クライアントがWCF通信リスナーを実行しているステートレスサービスに接続することが可能かどうかはわかりません。ここで
は私の設定です:
WCFコミュニケーションリスナー
private Func<StatelessServiceContext, ICommunicationListener> CreateListener()
{
return delegate (StatelessServiceContext context)
{
var host = new WcfCommunicationListener<IHello>(
wcfServiceObject: this,
serviceContext: context,
endpointResourceName: "ServiceEndpoint",
listenerBinding: CreateDefaultHttpBinding()
);
return host;
};
}
WCF ServiceManifest.xml
public static Binding CreateDefaultHttpBinding()
{
var binding = new WSHttpBinding(SecurityMode.None)
{
CloseTimeout = new TimeSpan(00, 05, 00),
OpenTimeout = new TimeSpan(00, 05, 00),
ReceiveTimeout = new TimeSpan(00, 05, 00),
SendTimeout = new TimeSpan(00, 05, 00),
MaxReceivedMessageSize = int.MaxValue,
};
var quota = new XmlDictionaryReaderQuotas
{
MaxArrayLength = int.MaxValue,
MaxDepth = int.MaxValue
};
binding.ReaderQuotas = quota;
return binding;
}
をバインド(私はデフォルトのTCPをも使用しましたさまざまなポートとのバインディング)
<Endpoints>
<Endpoint Name="ServiceEndpoint" Protocol="http" Port="8080" />
</Endpoints>
WCFコンソールアプリケーション
var address = new Uri("fabric:/ServiceFabricWcf.Azure/ServiceFabricWcf");
var client = GetClient(address, CreateDefaultHttpBinding());
try
{
var results = client.InvokeWithRetry(x => x.Channel.Hello());
System.WriteLine($"Results from WCF Service: '{results}'");
Console.ReadKey();
}
catch (Exception e)
{
System.Console.WriteLine("Exception calling WCF Service: '{e}'");
}
WCFクライアント
public static WcfServiceFabricCommunicationClient<IHello> GetClient(Uri address, Binding binding)
{
//ServicePartitionResolver.GetDefault(); Works with other services in cluster
var partitionResolver = new ServicePartitionResolver("<clientConnectionEndpointOfServiceCluster>:8080");
var wcfClientFactory = new WcfCommunicationClientFactory<IHello>(binding, null, partitionResolver);
var sfclient = new WcfServiceFabricCommunicationClient<IHello>(wcfClientFactory, address, ServicePartitionKey.Singleton);
return sfclient;
}
WCFクライアント工場
public class WcfServiceFabricCommunicationClient<T> : ServicePartitionClient<WcfCommunicationClient<T>> where T : class
{
public WcfServiceFabricCommunicationClient(ICommunicationClientFactory<WcfCommunicationClient<T>> communicationClientFactory,
Uri serviceUri,
ServicePartitionKey partitionKey = null,
TargetReplicaSelector targetReplicaSelector = TargetReplicaSelector.Default,
string listenerName = null,
OperationRetrySettings retrySettings = null
)
: base(communicationClientFactory, serviceUri, partitionKey, targetReplicaSelector, listenerName, retrySettings)
{
}
}
ありがとうございます。 WsHttpBindingを保持し、投稿したHTTP URI形式を使用してWCFコミュニケーションリスナーに「アドレス」を追加することができました。ローカルで動作し、Azure Service Fabricに公開されたときに動作します。このシナリオ(インターネットアクセス)では、通常のWCFクライアントを使用することができます(内部のみを想定した例ではありません) – Rioprelude