2009-07-16 12 views
7

मैं जानना चाहता हूं कि अनचाहे अपवाद डब्ल्यूसीएफ सेवा दुर्घटनाग्रस्त हो जाएगा या नहीं। मैंने निम्न प्रोग्राम लिखा है जो डब्ल्यूसीएफ सेवा द्वारा शुरू किए गए थ्रेड में अनचाहे अपवाद दिखाता है, जो पूरे डब्ल्यूसीएफ सेवा दुर्घटना को बना देगा।अनचाहे अपवाद डब्लूसीएफ सेवा दुर्घटनाग्रस्त कर देगा?

मेरा सवाल यह है कि, मैं पुष्टि करना चाहता हूं कि थ्रेड (डब्ल्यूसीएफ सेवा द्वारा शुरू) में अनचाहे अपवाद डब्ल्यूसीएफ दुर्घटनाग्रस्त हो जाएगा? मेरा भ्रम है मुझे लगता है कि डब्ल्यूसीएफ स्थिर सेवा होनी चाहिए जो अनचाहे अपवाद के कारण दुर्घटनाग्रस्त नहीं होनी चाहिए।

मैं एक स्वयं-होस्टेड विंडोज सेवा आधारित डब्ल्यूसीएफ सेवा विकसित करने के लिए वीएसटीएस 2008 + सी # + .NET 3.5 का उपयोग कर रहा हूं।

यहाँ कोड के संबंधित हिस्से हैं,

namespace Foo 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 
    [ServiceContract] 
    public interface IFoo 
    { 
     [OperationContract] 
     string Submit(string request); 
    } 
} 

namespace Foo 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class FooImpl : IFoo 
    { 
     public string Submit(string request) 
     { 
      return String.Empty; 
     } 
    } 
} 

namespace Foo 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     ServiceHost host = new ServiceHost(typeof(FooImpl)); 

     protected override void OnStart(string[] args) 
     { 
      host.Open(); 
      // start a thread which will throw unhandled exception 
      Thread t = new Thread(Workerjob); 
      t.Start(); 
     } 

     protected override void OnStop() 
     { 
      host.Close(); 
     } 

     public static void Workerjob() 
     { 
      Thread.Sleep(5000); 
      throw new Exception("unhandled"); 
     } 
    } 
} 
+2

आपका उदाहरण "डब्ल्यूसीएफ सेवा द्वारा शुरू किए गए थ्रेड में अनचाहे अपवाद" नहीं दिखाता है, लेकिन "विंडोज सेवा द्वारा शुरू किए गए थ्रेड में अनचाहे अपवाद" दिखाता है। डब्ल्यूसीएफ के साथ इसका कोई लेना-देना नहीं है। –

+0

मैं विंडोज सेवा (मेजबान ओपन()) में डब्ल्यूसीएफ स्वयं होस्ट शुरू करता हूं, जिसका मतलब है कि डब्ल्यूसीएफ सेवा में मेरा अनचाहे अपवाद है। भ्रमित शब्द के लिए खेद है, और मेरे प्रश्न के लिए कोई टिप्पणी या जवाब? – George2

उत्तर

11

हाँ, एक सूत्र में एक बिना क्रिया का अपवाद नीचे प्रक्रिया का समय लगेगा।

इस प्रक्रिया को दुर्घटना होगा:

static void Main(string[] args) 
{ 
    Thread t = new Thread(() => 
    { 
     throw new NullReferenceException(); 
    }); 
    t.Start(); 
    Console.ReadKey(); 
} 

यह एक ऐसा नहीं करेंगे:

static void Main(string[] args) 
{ 
    Thread t = new Thread(() => 
    { 
     try 
     { 
      throw new NullReferenceException(); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.ToString()); 
     } 
    }); 
    t.Start(); 
    Console.ReadKey(); 
} 
+0

धन्यवाद, यह जानना अच्छा है। – George2

3

आप एक अपवाद यह ऑपरेटिंग सिस्टम पर पारित हो जाता है संभाल नहीं है और यह हत्या करके जवाब देंगे क्या कभी भी आवेदन अपवाद का कारण बनता है।

अपवादों को संभालने के लिए आप को क्यों नहीं जोड़ते हैं ताकि आपकी सेवा मारे नहीं जा सके?

+0

यदि नहीं तो मुख्य धागे के अलावा किसी थ्रेड में अपवाद होता है। ऊपर फ्रेडरिक मोर्क का उदाहरण देखें। – user141682

+0

फ्रेड्रिक के उदाहरण में प्रक्रिया को कम करने के अपवाद को रोकने के लिए एक कोशिश/पकड़ ब्लॉक है, जो मैंने ऊपर कहा है। – jussij

1

यदि आपके पास उचित त्रुटि प्रबंधन नहीं है तो यह प्रोग्राम क्रैश कर देगा। इसका अच्छा अभ्यास अपने कोड में एक

try{//do something 
} 
catch{ //handle errors 
} 
finally{//final clean up 
} 

ब्लॉक डाल करने के लिए सुनिश्चित करें कि एक अपवाद यह शान से संभाल करने के लिए है अगर फेंक करता है बनाने के लिए। उदाहरण http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx

17

सेवा पक्ष पर एक अनचाहे अपवाद चैनल (क्लाइंट और सर्वर के बीच कनेक्शन) को "गलती" के कारण देगा - उदा। फेंकने के लिए।

उस बिंदु से, आप क्लाइंट से उसी प्रॉक्सी क्लाइंट ऑब्जेक्ट इंस्टेंस का उपयोग करके कॉल नहीं कर सकते - आपको प्रॉक्सी क्लाइंट को फिर से बनाना होगा।

आपकी सर्वश्रेष्ठ शर्त सर्वर के पक्ष में जब भी संभव हो, सभी त्रुटियों को संभालना है। IErrorHandler इंटरफ़ेस देखें, जिसे आपको अपने सेवा कार्यान्वयन वर्ग पर लागू करना चाहिए, ताकि सभी अनचाहे .NET अपवादों को या तो SOAP दोषों में बदल दिया जा सके (जो नहीं चैनल को गलती का कारण बनता है), या पूरी तरह रिपोर्ट/निगलने के लिए।

मार्क

+0

हाय मार्क, मैंने आईआरआरआर हैंडलर के बारे में सावधानीपूर्वक एमएसडीएन लिंक को पढ़ा है। एक भ्रम, मेरी समस्या का अनचाहे अपवाद एक थ्रेड से है जो स्वयं द्वारा स्पष्ट रूप से शुरू किया गया है, और यह डब्ल्यूसीएफ ऑपरेशन थ्रेड नहीं है। मुझे लगता है कि आईआरआररहैंडलर डब्ल्यूसीएफ ऑपरेशन थ्रेड (यानी थ्रेड जो ऑपरेशन कंट्रैक्ट ऑपरेशंस करता है) में अनचाहे अपवाद को पकड़ता है, और चूंकि मेरा धागा डब्ल्यूसीएफ ऑपरेशन थ्रेड नहीं है, यह मेरी समस्या से संबंधित नहीं है, सही? कोई टिप्पणी? – George2

+1

क्या आपने अपने डब्ल्यूसीएफ सर्वर कोड से वह धागा शुरू किया था? सवाल वास्तव में है: आपके थ्रेड को क्रैश करने से आपके सर्वर कोड को प्रभावित होगा - अगर यह आपके सर्वर कोड में अपवाद की ओर जाता है, तो IErrorHandler इंटरफ़ेस को कार्यान्वित करने में मदद मिलेगी। –

+0

धन्यवाद मार्क, 1. मैं इस बारे में उलझन में हूं कि "अपने डब्ल्यूसीएफ सर्वर कोड से उस धागे को शुरू करें", क्या आप कृपया स्पष्टीकरण दे सकते हैं? डेवलपर पॉइंट ऑफ व्यू से डब्ल्यूसीएफ सिर्फ अनुबंधों का एक सेट है, मुझे यकीन नहीं है कि डब्ल्यूसीएफ सर्वर का क्या मतलब है। :-) 2. आपका मतलब है कि गैर-डब्ल्यूसीएफ थ्रेड से अनचाहे अपवाद भी आईरर हैंडलर द्वारा पकड़ा जाएगा? – George2

7

WCF क्रम के डिफ़ॉल्ट व्यवहार को सभी लेकिन कुछ प्रकार के अपवाद निगल करने के लिए है। तो यदि आपका कोड डब्लूसीएफ रनटाइम (जैसे कि यदि आप डब्लूसीएफ ऑपरेशन से फेंकते हैं) के ढेर को अपवाद फेंक देते हैं, तो यह ऐप को क्रैश नहीं करेगा (जब तक इसे "घातक" अपवाद नहीं माना जाता है, जैसे ओओएम, एसईएचएक्सप्शन, इत्यादि। ।)। यदि अपवाद ऑपरेशन के गलती अनुबंध का हिस्सा नहीं है, तो चैनल को दोषी ठहराया जाएगा, अन्यथा नहीं।

यदि डब्ल्यूसीएफ रनटाइम स्टैक पर आपके कोड के नीचे नहीं है, तो अपवाद/प्रक्रिया/क्रैश प्रक्रिया।

यह एएसपी.NET रनटाइम के समान है।

यदि आप सामान्य रूप से डब्ल्यूसीएफ संचालन से बाहर निकलने वाले अपवादों के लिए स्क्रीन करना चाहते हैं, तो मैं IOperationInvoker इंटरफ़ेस का उपयोग करने की अनुशंसा करता हूं। आप आईरर हैंडलर का भी उपयोग कर सकते हैं, लेकिन आपके आईरर हैंडलर कार्यान्वयन को "उपयोगकर्ता कोड" (डब्ल्यूसीएफ ऑपरेशंस) से निकाले गए अपवादों के अलावा अधिसूचनाओं के बारे में अधिसूचित किया जाएगा, जैसे डब्लूसीएफ आंतरिक आई/ओ धागे पर सॉकेटएबॉर्टेड एक्सेप्शन, जो शायद आपके लिए दिलचस्प नहीं हैं।

1

आप ग्राहक पक्ष में त्रुटियों को संवाद करने और सेवा में तर्क रखने के लिए FaultException का उपयोग कर सकते हैं।

यह example देखें, उम्मीद है कि यह आपकी सहायता करता है।

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