簡體   English   中英

WCF雙工nettcp通道沒有故障

[英]WCF duplex nettcp channel not faulting

問題

我有這個奇怪的問題。 我在控制台應用程序中托管WCF服務器:Console.WriteLine(“按'q'退出。”);

            var serviceHost = new ServiceHost(typeof(MessageService));
            serviceHost.Open();
            while (Console.ReadKey().KeyChar != 'q')
            {
            }
            serviceHost.Close();

它公開了兩個用於發布和訂閱的端點(雙工綁定),當我停止或退出控制台應用程序時,我永遠不會在客戶端收到錯誤的通道。 我想通知客戶端服務器已關閉。 知道這里出了什么問題嗎?

我只想在控制台應用程序關閉時引發以下任一事件:

    msgsvc.InnerDuplexChannel.Faulted += InnerDuplexChannelOnFaulted;
    msgsvc.InnerChannel.Faulted += InnerChannelOnFaulted;

從MSDN:雙工模型不會自動檢測服務或客戶端何時關閉其通道。 因此,如果服務意外終止,則默認情況下不會通知該服務,或者如果客戶端意外終止,則不會通知該服務。 客戶端和服務可以選擇使用自己的協議來相互通知。

AFAIK tcp通道可以很好地響應(持久)連接問題,但是您可以使用回調在服務器不可用之前通知客戶端。 在客戶端,您可以使用一些虛擬的ping / poke方法“ OnTimer”來獲取實際的連接狀態/保持活動狀態。 我認為此時恢復客戶端代理(重新連接)是一件好事。 如果服務提供元數據終結點,則您還可以調用svcutil進行試用連接或以編程方式檢索元數據:

  Uri mexAddress = new Uri("http://localhost:5000/myservice");
  var mexClient = new MetadataExchangeClient(mexAddress, MetadataExchangeClientMode.HttpGet);
  MetadataSet metadata = mexClient.GetMetadata();
  MetadataImporter importer = new WsdlImporter(metadata);
  ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

  ContractDescription description =
  ContractDescription.GetContract(typeof(IMyContract));
  bool contractSupported = endpoints.Any(endpoint =>
  endpoint.Contract.Namespace == description.Namespace &&
  endpoint.Contract.Name == description.Name);

要么

ServiceEndpointCollection endpoints = MetadataResolver.Resolve(typeof(IMyContract), mexAddress, MetadataExchangeClientMode.HttpGet)

如果您是客戶端,並且預訂了IClientChannel的Closing,Closed和Faulted這3個事件,則在關閉服務控制台應用程序時至少應該看到Closing和Closed事件。 我不知道為什么。 如果正確關閉的話,您會認為您會看到“故障”。 我正在使用tcp.net全雙工通道,我看到這些事件就很好了。 請記住,那是在2017年,因此此后情況可能有所變化,但是我一直在代碼中依賴這些事件。 對於那些說雙工模型看不到通道關閉的人,我不太理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM