2008-11-24 6 views
30

मेरे पास एक डब्ल्यूसीएफ सेवा है जो दोषपूर्ण स्थिति में प्रवेश नहीं करनी चाहिए। यदि कोई अपवाद है, तो इसे लॉग किया जाना चाहिए और सेवा को निरंतर जारी रखना चाहिए। सेवा में एक तरह का ऑपरेशन अनुबंध है और एमएसएमक्यू से संदेश पढ़ रहा है।मैं डब्ल्यूसीएफ सेवा को एक दोषपूर्ण स्थिति में प्रवेश करने से कैसे रोकूं?

मेरे समस्याओं दुगना कर रहे हैं:

  1. सेवा निगलने जा करने के लिए एक अपवाद/गलती दिखाई देता है तो मैं यह डिबग करने में असमर्थ हूँ। अपवाद का पर्दाफाश करने के लिए मुझे सेवा कैसे प्राप्त करें ताकि मैं लॉग या संभाल सकूं?
  2. सेवा के बाद एक दोषपूर्ण स्थिति में प्रवेश करने के लिए यह अपवाद निगल लिया गया है। मैं सेवा को में किसी दोषपूर्ण स्थिति में प्रवेश करने से रोकता हूं?
+0

यहां आप सभी सिद्धांत प्राप्त कर सकते हैं http://msdn.microsoft.com/en-us/library/ms789041(v=vs.110).aspx –

उत्तर

18

अधिकांश, अगर डब्ल्यूसीएफ ट्रेस (Configuring Tracing) में सभी अपवाद नहीं देखे जा सकते हैं और ट्रेस Service Trace Viewer के साथ सबसे अच्छा देखा जाता है।

जाहिर है, यह ऐसा कुछ नहीं है जो आपको पूरे दिन उत्पादन वातावरण में चलाना चाहिए, लेकिन यह किसी भी तरह से समस्या निवारण में सहायता करता है।

इसके अलावा, ध्यान दें कि आपके द्वारा उपयोग किए जाने वाले सत्र मोड के आधार पर चलने वाले सच्चे "आग और भूलने" के रूप में नहीं चल सकते हैं। यदि आपके पास सत्रमोड के लिए आपकी सेवा कॉन्फ़िगर की गई है। अनुमोदित या यहां तक ​​कि सत्र मोड। आवश्यक है, ऑनवे ऑपरेशन चलाएगा जैसे कि यह बिल्कुल चालू नहीं था (यह netTcp बाइंडिंग पर ओवरवे का उपयोग करते समय देखा जा सकता है)। हालांकि, मुझे पता नहीं है कि क्या आप अपवादों के प्रकार को बदल सकते हैं, या जब आप उन्हें प्राप्त करते हैं। हालांकि, किसी भी मामले में, अगर आपको अनुरोध नहीं भेजा जा सका तो आपको अपवाद प्राप्त करना चाहिए। AFAIK, ऑनवे "समाप्त होता है" जब इसे सफलतापूर्वक सर्वर पक्ष पर प्राप्त किया जाता है। तो तब तक (डब्ल्यूसीएफ ढांचे से संबंधित) अपवादों के लिए कुछ जगह है (क्रमबद्धता/deserialization दिमाग में आता है)।

फिर, इस तरह के ढांचे से संबंधित अपवादों को सबसे अच्छा देखा जाता है (यहां तक ​​कि एक आईररहैंडलर उन सभी तथ्यों के कारण नहीं मिलता है जब इसे अनुरोध/प्रतिक्रिया प्रवाह में कहा जाता है) उपर्युक्त ट्रेस/ट्रेसवेवर का उपयोग करके।

+0

मुझे इसी तरह के मुद्दे का सामना नहीं करना पड़ रहा है। मेरे पास netTcp बाइंडिंग के साथ उत्पादन पर चल रही सेवा है, जिसमें कुछ तरीकों से IsOneway = True और सत्र मोड सेट है आवश्यकता के लिए। हालांकि जब कोई अपवाद होता है, तो सेवाएं फॉल्ट किए गए राज्य में जाती हैं। इसे काम करने के लिए मुझे इसे पुनरारंभ करना होगा –

11

अपवाद प्रॉक्सी को गलती करेंगे। आप AFAIK ऐसा नहीं कर सकते कि के बारे में ज्यादा: का कारण नहीं है अपवाद ;-p

मैं एक छोटे से हैरान हूँ कि एक तरह से अभी भी एक समस्या का कारण है, लेकिन पीढ़ी एल में निगलने के लिए, वहाँ 3 रहे हैं हूँ पहलुओं:

  1. क्या आप faults फेंक रहे हैं? या अपवाद? यह मायने रखता है (और "दोष" होना चाहिए)
  2. हैक के रूप में, आप डीबग अपवाद संदेशों को सक्षम कर सकते हैं - लेकिन इसे बंद कर दें !!!
  3. क्या आप सेवा ऑब्जेक्ट का उपयोग कर रहे हैं? मेरे पास इस सटीक विषय पर केवल blogged है ... मूल रूप से, आपका "उपयोग" अपवाद को निगल सकता है। 3 विकल्प:

    • का उपयोग नहीं करते
    • उपवर्ग प्रॉक्सी "का उपयोग कर" और ओवरराइड निपटान()
    • लपेट, ब्लॉग के अनुसार
+0

टिप्पणियों के लिए धन्यवाद मार्क। मैंने अपवादों को ट्रैक करने और ट्रैक करने के लिए उपयोग करने से रोक दिया लेकिन कोई किस्मत नहीं। व्यापार परत जो डब्ल्यूसीएफ सेवा में कॉल कर रही है, अपवाद फेंक रही है लेकिन इन्हें कहीं निगल लिया जा रहा है ... रहस्य ... – Guy

+1

आप FaultException पर स्विच करने का प्रयास कर सकते हैं जहां टी एक प्रकाशित गलती है - जो चीजों की मदद कर सकती है।और ध्यान दें कि प्रॉक्सी को बंद करना अभी भी बहुत महत्वपूर्ण है; बस "उपयोग" करना इस अवसर पर जो कुछ भी हम चाहते हैं वह जरूरी नहीं है। –

+0

मुझे लगता है कि केवल अपवाद जिन्हें सेवा द्वारा पकड़ा और लपेटा नहीं गया है, प्रॉक्सी को गलती करेंगे, लेकिन सभी अपवाद –

7

बारे में 2) ...

चाल है कि आप "का उपयोग" का उपयोग करना चाहिए और हमेशा प्रॉक्सी कि एक अपवाद फेंक दिया पर बीच में बंद करें() बुलाना चाहिए है। लेख WCF Gotcha यह सब बताता है।

हम उस लेख से प्रेरित सेवा कक्षा का उपयोग करते हैं जो सेवा कॉल को लपेटता है। यह मेरे प्रोजेक्ट से नमूना कोड है:

ServiceHelper<CodeListServiceClient, CodeListService.CodeListService>.Use(
    proxy => seasonCodeBindingSource.DataSource = proxy.GetSeasonCodes(brandID); 
); 

और यह सेवा हेल्पर का कोड है, जो लेख से थोड़ा संशोधित है। अब तक यह हमें वास्तव में अच्छी तरह से सेवा दी है।

using System; 
using System.ServiceModel; 

namespace Sportina.EnterpriseSystem.Client.Framework.Helpers 
{ 
    public delegate void UseServiceDelegate<TServiceProxy>(TServiceProxy proxy); 

    public static class ServiceHelper<TServiceClient, TServiceInterface> where TServiceClient : ClientBase<TServiceInterface>, new() where TServiceInterface : class 
    { 
     public static void Use(UseServiceDelegate<TServiceClient> codeBlock) 
     { 
      TServiceClient proxy = null; 
      bool success = false; 
      try 
      { 
       proxy = new TServiceClient();    
       codeBlock(proxy); 
       proxy.Close(); 
       success = true; 
      } 
      catch (Exception ex) 
      { 
       Common.Logger.Log.Fatal("Service error: " + ex);         
       throw; 
      } 
      finally 
      { 
       if (!success && proxy != null) 
        proxy.Abort(); 
      } 
     } 
    } 
} 
+3

'डब्ल्यूसीएफ गोटा' पोस्ट का लिंक टूटा हुआ है, लेकिन मेरे पास इसे संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं है। यहां अच्छा लिंक है: http://old.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx। – yzorg

+0

@yzorg - लिंक के लिए धन्यवाद, मैंने अभी जवाब अपडेट किया है। – LamonteCristo

6

मुझे एक समस्या थी जहां चैनल एक ReceiveTimeout अपवाद के बाद एक दोषपूर्ण स्थिति में बना रहा। इससे सेवा किसी भी बाद के कनेक्शन द्वारा अनुपयोगी हो जाएगी।

मेरे लिए गलती राज्य से सेवा ठीक करने के लिए ठीक संचार चैनल की गलती घटना को संभालने के लिए किया गया था:

channelFactory = new ChannelFactory<IService>(endpoint); 
channelFactory.Faulted += OnChannelFaulted; 
var channel = channelFactory.CreateChannel(); 

फिर परिभाषित OnChannelFaulted:

void OnChannelFaulted(object sender, EventArgs e) 
{ 
    channelFactory.Abort(); 
} 

नोट: मैं चला रहा हूँ Web.config के बाइंडिंग का उपयोग कर कोड बनाम डब्ल्यूसीएफ कॉन्फ़िगरेशन के माध्यम से।

8

आमतौर पर डब्ल्यूसीएफ सेवा सर्विसहोस्ट में होस्ट की जाती है, अगर डब्ल्यूसीएफ-सेवा विफल हो जाती है तो डब्ल्यूसीएफ सेवा को मारने और एक नया शुरू करने का एकमात्र विकल्प है। जब WCF सेवा विफल रहता है

ServiceHost एक घटना ट्रिगर "गलती" है कि सक्रिय है है:

ServiceHost host = new ServiceHost(new Service.MyService()); 
host.Faulted += new EventHandler(host_faulted); 
host.Open(); 

यह गलती के कारण अपवाद प्राप्त करने के लिए संभव है, लेकिन यह थोड़ा अधिक काम की आवश्यकता है:

public class ErrorHandler : IErrorHandler 
{ 
    public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 

    } 

    public bool HandleError(Exception error) 
    { 
     Console.WriteLine("exception"); 
     return false; 
    } 
} 

public class ErrorServiceBehavior : IServiceBehavior 
{ 
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 

    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 

    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     ErrorHandler handler = new ErrorHandler(); 
     foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) 
     { 
      dispatcher.ErrorHandlers.Add(handler); 
     } 
    } 
} 

ServiceHost host = new ServiceHost(new Service.MyService()); 
host.Faulted += new EventHandler(host_faulted); 
host.Description.Behaviors.Add(new ErrorServiceBehavior()); 
host.Open(); 

क्रेडिट http://www.haveyougotwoods.ca/2009/06/24/creating-a-global-error-handler-in-wcf

+1

ने कोशिश की लेकिन हैंडलररर विधि कभी हिट नहीं हुई है, भले ही मैंने फॉल्टड इवेंट हैंडलर मारा। – Brent

28

कैसे दोष को संभालने के लिए पर आधिकारिक दस्तावेज यहाँ है:

मुख्य पृष्ठ Channel Model Overview

पर होने के साथ

वहाँ एक अच्छा राज्य कैसे बातें होती हैं दिखा आरेख है:

enter image description here

संबंधित मुद्दे

 संबंधित मुद्दे