私は、winform アプリでホストされている 2 つの WCF サービスを持っています。状況によっては、pollingduplex エンドポイントが正しく開かず、クライアントが接続されないことがあります。これを検出できるようにするために、Silverlight out of browser app はインターフェイスをポーリングし、応答を受信すると、tcp ソケットを介してサービスに通知します。
Out-of-browser アプリの通知が届かない場合、wcf サービスを再起動したいと考えています。両方のサービスで servicehost.close() を呼び出し、その後に servicehost.open() を呼び出します。
http://localhost:18524/IService/
奇妙なことに、basichttp バインディングを使用したサービスのオープン/クローズは成功しますが、ポーリング デュプレックス バインディングを使用したサービスのオープンはChanneldispatcher 例外で失敗します。サービスホスト。
pollingduplex チャネルのオープン/クローズ タイムアウトで遊んで、クローズ/オープン間の時間を遅らせましたが、効果はありませんでした。
pollingduplex 接続のポートを解放する方法を知っている人はいますか?
手伝ってくれてありがとう。
オープン クローズ コード: public void StartServices() { StopServices();
try
{
var configSyncService = new ConfigurationSyncService();
configSyncService.Open();
var mainService = new Service();
mainService.Open();
serviceHosts.Add(configSyncService);
serviceHosts.Add(mainService);
}
catch (Exception ex)
{
string msg = String.Format("Exception starting WCF service for Centrale: {0}", ex.Message);
LOG.Fatal(
LogProperties.Bedienpost,
ex,
Resources.ERROR_STARTING_WCF,
ex.Message);
throw ex;
}
}
public void StopServices()
{
try
{
var result = Parallel.ForEach(serviceHosts, service =>
{
if ((service != null) && (service.State == CommunicationState.Opened))
{
try
{
service.Close();
}
finally
{
service.Dispose();
service = null;
}
}
else if ((service != null) && (service.State != CommunicationState.Faulted))
{
service.Dispose();
service = null;
}
});
if (result.IsCompleted)
{
serviceHosts.Clear();
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
ポーリング二重チャネルの構成:
private Binding CreateCustomPollingDuplexBinding()
{
CustomBinding binding = new CustomBinding();
binding.Name = "pollingDuplexHttpBinding";
binding.ReceiveTimeout = new TimeSpan(0, 5, 0);
binding.SendTimeout = new TimeSpan(0, 5, 0);
binding.OpenTimeout = new TimeSpan(0, 5, 0);
binding.CloseTimeout = new TimeSpan(0, 5, 0);
binding.Elements.Add(new PollingDuplexBindingElement(PollingDuplexMode.SingleMessagePerPoll));
TextMessageEncodingBindingElement textEncoding = new TextMessageEncodingBindingElement();
textEncoding.ReaderQuotas.MaxArrayLength = int.MaxValue;
textEncoding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
textEncoding.ReaderQuotas.MaxDepth = int.MaxValue;
textEncoding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
textEncoding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.Elements.Add(textEncoding);
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
httpTransport.MaxBufferPoolSize = int.MaxValue;
httpTransport.MaxBufferSize = int.MaxValue;
httpTransport.MaxReceivedMessageSize = int.MaxValue;
httpTransport.AuthenticationScheme = AuthenticationSchemes.Ntlm;
binding.Elements.Add(httpTransport);
return binding;
}