2009-11-12 12 views
5

Gerçek WCF uygulamasında sahip olduğum bir sorunu yeniden üreten örnek bir WCF projem var. Kodun ve yapılandırma dosyalarında zaman aşımı setleri doğrultusunda kapsamınızı benim örnek WCF uygulaması hereİletişim nesnesi, Aboneleştirilmiş olduğu için iletişim için kullanılamaz

kaynak kodunu indirebilir, ben appening ne anlamıyorum: Eğer geçiyoruz gibi

**** Server exception : System.ServiceModel.CommunicationObjectAbortedException: 

The communication object, System.ServiceModel.Security.SecuritySessionServerSettings+SecurityReplySessionChannel, cannot be used for communication because it 
has been Aborted. 

    at System.ServiceModel.Channels.CommunicationObject.ThrowIfClosedOrNotOpen() 
    at System.ServiceModel.Security.SecuritySessionServerSettings.ServerSecuritySessionChannel.SecureApplicationMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionServerSettings.SecuritySessionRequestContext.OnReply(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestContextBase.Reply(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestContextBase.Reply(Message message) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.Reply(MessageRpc& rpc) 

**** client exception : : System.ServiceModel.Security.MessageSecurityException: An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail. ---> System.ServiceModel.FaultException: The message could not be processed. This is most likely because the action 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT/Cancel' is incorrect or because the message contains an invalid or expired security context token or because there is a mismatch between bindings. The security context token would be invalid if the service aborted the channel due to inactivity. To prevent the service from aborting idle sessions prematurely increase the Receive timeout on the service endpoint's binding. 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.ProcessRequestContext(RequestContext requestContext, TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.ReceiveInternal(TimeSpan timeout, SecurityProtocolCorrelationState correlationState) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.CloseOutputSession(TimeSpan timeout) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.CloseSession(TimeSpan timeout, Boolean& wasAborted) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ClientBase`1.Close() 
    at System.ServiceModel.ClientBase`1.System.IDisposable.Dispose() 
    at WindowsFormsApplication1.Program.Main() in C:\Users\sdoucet\Documents\Visual Studio 2008\Projects\TestWCFLongExecution\WindowsFormsApplication1\Program.cs:line 25 

cevap

1

görünüyor istisnalar müşteriye geri döndü. WCF, normal istisnalardan hoşlanmaz, hata durumunda fauls ister FaultException ister. Sonra ve istisna iade edildiğinde kanal arızalı durumda ve tekrar kullanılamaz. Bir FaultException sonrası kanal hala kullanılabilir.

+0

Haklısınız, ancak özel durum kodum tarafından atılmıyor. WCF altyapısı tarafından atılır. Bu istisnanın neden atıldığını ve nasıl önleneceğini bilmem. Hizmetimin 10 dakika boyunca çalıştığını biliyorum, ancak zaman aşımına uğrayan kümelere göre, bu özel durumu anlamıyorum. – Sebastien

+2

Yapılacak ilk şey, hizmette tam izlemeyi etkinleştirmektir. Bu, orijinal sorunun ne olduğu konusunda size birçok bilgi verecektir. – Maurice

6

Hizmet barındıran uygulama havuzu, 1'den büyük Maksimum Çalışan İşlemlerine sahip olacak şekilde yapılandırıldığı için benzer bir sorunla karşılaştık. Başarmak için Abort'a veya Kapat'a yapılan bir çağrı için, işlenen aynı hizmet örneğine yönlendirilmesi gerekir. orijinal istek.

+1

Bunu gönderdiğiniz için teşekkür ederim, müşterilerimizdeki ortamlarda aynı sorunu yaşadım. Onların devlerinden biri 'Maksimum Çalışan Süreçleri' ni 5'e getirdi ve bu istisnalara neden oldu. Biz wsfederationhttpbinding kullanıyorduk ve Güvenlik Kodu Servisi (STS) de kullanıyoruz, istisna yapıyordu ki bu daha da kafa karıştırıcıydı - belirteç geçersizdi. Aslında, talep sadece bazen yanlış çalışan sürece yönlendiriliyordu. –

+0

Aynı sorunu gözlemledik ve mesaj güvenliği ile wshttpbinding kullanıyorduk. Web servis makinelerinin önündeki Netscalar yük dengeleyicilere sahip olmak, daha da zorlu hale geldi. Başlangıçta LB'nin yapışkan oturumları sürdürmediğini düşündük ve LB'yi eşitlikten çıkarmanın problemi çözüp çözemeyeceğini anlamaya çalıştık. Fakat bunu yapmadı ve Maksimum İşçi Süreçleri ayarını farkettiğimizde 1'den fazlaya ayarlandı. –

2

Wcf hizmeti async çağrısı yaptığım benzer bir sorun yaşadım. Sonucu async_completed yönteminde aldıktan sonra bir istisna aldım.

"istisna sonucu geçersiz hale operasyon sırasında meydana gelen istisnanın InnerException edin."

InnerException:
"o iptal edildi çünkü iletişim nesnesi iletişim için kullanılamaz"

Çok fazla çaba harcadıktan sonra çözümü buluyorum, yalnızca async_completed yöntemine atmadan istisnayı yakala. (yani, try/catch'u uyguladı). Tam olarak sorunun ne olduğunu anlamadım ama bir şekilde iletişim kanalı kırılıyor.

Ben Hala bu doğru yaklaşım olduğundan emin değilim, ama operasyon sonucu ile benim senaryo gereği ben furtherly şey yapmıyorum şu bağlantıda

http://geekswithblogs.net/SoftwareDoneRight/archive/2008/05/23/clean-up-wcf-clients--the-right-way.aspx

yukarıdaki yargıyı çalıştı. Yani istisna yakalıyor ve servisi durduruyor.

İlgili konular