सर्वर पर ListeExceptionDetailInFaults (या तो ServiceBehaviorAttribute या <serviceDebug> कॉन्फ़िगरेशन व्यवहार से) चालू करें


157

मेरे पास एक WCF सेवा है जो पूरी तरह से काम कर रही है, और कुछ बदल गया है और मुझे नहीं पता कि क्या है।

मुझे यह अपवाद मिलता है:

System.ServiceModel.FaultException: सर्वर आंतरिक त्रुटि के कारण अनुरोध को संसाधित करने में असमर्थ था। त्रुटि के बारे में अधिक जानकारी के लिए, या तो सर्वर पर अपवाद जानकारी भेजने के लिए, या Microsoft .NET फ्रेमवर्क 3.0 SDK प्रलेखन के अनुसार ट्रेसिंग को चालू करने के लिए सर्वर पर शामिल करें ExeExceptionDetailInFaults (या तो ServiceBehaviorAttribute से या कॉन्फ़िगरेशन व्यवहार से) चालू करें। और सर्वर ट्रेस लॉग का निरीक्षण करें।

यह भ्रामक है क्योंकि मैं .NET 4.0 चला रहा हूं।

मैं कहां से चालू करूं IncludeExceptionDetailInFaults? मैं इसे खोजने के लिए जूझ रहा हूं।

जवाबों:


265

अपनी फ़ाइल में एक व्यवहार परिभाषित करें .config:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debug">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    ...
  </system.serviceModel>
</configuration>

फिर इन लाइनों के साथ अपनी सेवा में व्यवहार लागू करें:

<configuration>
  <system.serviceModel>
    ...
    <services>
      <service name="MyServiceName" behaviorConfiguration="debug" />
    </services>
  </system.serviceModel>
</configuration>

आप इसे प्रोग्रामेटिक रूप से भी सेट कर सकते हैं। इस प्रश्न को देखें ।


1
हाय ओटिवेल, मैं अपना मामला अलग-अलग साइट और सेवाओं वाले नेस्टेड फ़ोल्डर हैं। वह फ़ोल्डर जहाँ मेरी सेवा रहती है और मुझे त्रुटि हो रही है, मुख्य वेब अनुप्रयोग के सापेक्ष नेस्टिंग की तीसरी डिग्री पर है और मैंने प्रत्येक सेवा के लिए web.config समर्पित किया है। मैं जोड़ने के हिसाब से अपने संबंधित web.config को बदल देता हूं <सेवाडबग में शामिल करेंExceptionDetailInFaults = "true">। लेकिन मुझे अभी भी त्रुटि मिल रही है। क्या मुझे संपूर्ण वेब एप्लिकेशन में सभी web.config को बदलने की आवश्यकता है?
मैक्सरिकसन

2
@ अक्षय कुलकर्णी: निश्चित नहीं, मुझे आपके मामले का अनुभव नहीं है। सुनिश्चित करें कि आपकी सेवाओं में पहले सेवाबेहियर (चेक गोगोग्रा उत्तर) का संदर्भ है । यदि वह समस्या का समाधान नहीं करता है, तो कृपया SO पर एक प्रश्न पूछें।
ओटीएल

1
@MatthewLock: अपडेट किया गया उत्तर। इसके अलावा, यदि आपको अधिक विवरण की आवश्यकता है , तो <व्यवहार> और <सेवा> जांचें ।
ओटियल जूल

1
विजुअल स्टूडियो मुझे बताता है कि सर्विसबाइवर्स सिस्टम का सीधा बच्चा नहीं हो सकता है। सेवर्समॉडल। संपन्न.ओकेली के जवाब के साथ जा रहा है।
andbb

3
नोट: VS2013 डिफ़ॉल्ट web.config में <serviceDebug> टैग को गलत पर सेट करता है। यदि आपको ऐसा नहीं लगता है कि मैंने नहीं किया है और XML को स्पष्ट रूप से जोड़ दिया है कि फाइल जीत में आखिर क्या है। आशा है कि यह किसी के लिए उपयोगी है।
जेफ

63

यह app.config फ़ाइल में है।

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>

9
यदि आप यह चाहते हैं कि आप अपनी सभी सेवाओं पर लागू करना चाहते हैं, तो नाम व्यवहार विशेषता का नाम सेट न करें (@ उत्तर में)।
पास्का

47

यदि आप कोड द्वारा ऐसा करना चाहते हैं, तो आप इस तरह का व्यवहार जोड़ सकते हैं:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

इसे अपने ServiceHostऑब्जेक्ट उदाहरण में जोड़ें : उदाहरण:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
डैनियल बोनट्टी

28

आप इसे अपनी श्रेणी की घोषणा के ऊपर [ServiceBehavior] टैग में भी सेट कर सकते हैं जो इंटरफ़ेस को इनहेरिट करता है

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}

अमर ब्लू एक सार्वजनिक रूप से जारी संस्करण के लिए छूट विवरण का खुलासा नहीं करने में सही है, लेकिन परीक्षण के प्रयोजनों के लिए यह एक आसान उपकरण है। रिहा करते समय हमेशा पीछे मुड़ें।


मैंने इसे एक एप्लिकेशन में उपयोग किया है जो बैकएंड पर चलता है और सार्वजनिक रूप से कभी देखने योग्य नहीं होगा, इसलिए यह पूरी तरह से काम करता है
AlbatrossCafe

4

मुझे भी वही त्रुटि मिल रही थी, WCF मेरे लिए ठीक से काम कर रहा था जब मैं इसे देव परिवेश में अपनी साख के साथ उपयोग कर रहा था, लेकिन जब कोई और इसे TEST में उपयोग कर रहा था, तो यह उसी त्रुटि को फेंक रहा था। मैंने बहुत सारे शोध किए, और फिर कॉन्फ़िगर अपडेट करने के बजाय, दोष अपवाद की मदद से WCF विधि में एक अपवाद को संभाला। इसके अलावा WCF के लिए पहचान को उसी क्रेडेंशियल्स के साथ सेट करने की आवश्यकता है जो डेटाबेस में एक्सेस कर रहे हैं, किसी ने आपका अधिकार बदल दिया होगा। कृपया उसी के लिए कोड नीचे देखें:

 [ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    ForDataset GetCCDBdata();

    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    string GetCCDBdataasXMLstring();


    //[OperationContract]
    //string GetData(int value);

    //[OperationContract]
    //CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

  [DataContract]
public class ServiceData
{
    [DataMember]
    public bool Result { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
    [DataMember]
    public string ErrorDetails { get; set; }
}

अपने service1.svc.cs में आप इसे कैच ब्लॉक में उपयोग कर सकते हैं:

 catch (Exception ex)
        {
            myServiceData.Result = false;
            myServiceData.ErrorMessage = "unforeseen error occured. Please try later.";
            myServiceData.ErrorDetails = ex.ToString();
            throw new FaultException<ServiceData>(myServiceData, ex.ToString());
        }

और नीचे दिए गए कोड की तरह क्लाइंट एप्लिकेशन में इसका उपयोग करें:

  ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata();

            string str = obj.GetCCDBdataasXMLstring();

        }

        catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex)
      {
          Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine);
          Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails);
          Console.ReadLine();
      }

बस यह कोशिश करो, यह सुनिश्चित करने में मदद मिलेगी कि सटीक मुद्दा कैसे मिलेगा।


4
आपको अंतर्निहित अपवाद विवरणों को उजागर नहीं करना चाहिए। क्लाइंट और सर्वर के बीच अपवादों को अलग करने और इस ध्वज की आवश्यकता के लिए संपूर्ण उद्देश्य, ग्राहक को उपलब्ध कराई जा रही अपवाद सूचना को रोकना है। एक दुर्भावनापूर्ण उपयोगकर्ता आपकी सेवा में हेरफेर करने के लिए इस जानकारी का उपयोग कर सकता है! यदि आप विकसित कर रहे हैं, तो व्यवहार का उपयोग करें शामिल करें अपवाद के रूप में संपूर्ण अपवाद का प्रचार करने के लिए, या परिनियोजन में वर्णित त्रुटियां, एक बहुत ही मूल त्रुटि देने वाले एक दोष को बढ़ाएं, जैसे कि स्टैक ट्रेस और पूर्ण विवरण देने के बजाय "फ़ाइल को सहेजने में असमर्थ"। अपवाद।
अमर ब्लू

हाय .. मेरे मामले में अन्य सभी सेवा फ़ंक्शन को फ़ंक्शन द्वारा कॉल किया जा रहा है जो फ़ाइल को बचाने के लिए उपयोग कर रहा है im उस अपवाद को फेंक रहा है ... सटीक समस्या जानने के लिए मैंने लॉगिंग सिस्टम का उपयोग किया लेकिन उस विधि के लिए कोई लॉग नहीं बनाया गया है ... im किसी भी फ़ाइल और 3) अपवाद लॉग को बचाने से पहले सेवा हिट 2) जब 3 लॉग 1 बनाने)।
user3217843

0

जैसा कि त्रुटि जानकारी में कहा गया है कि पहले ग्राहक पक्ष और सेवा पक्ष दोनों में टाइमआउट मान बढ़ाने की कोशिश करें:

<basicHttpBinding>
    <binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647"
      openTimeout="00:20:00" 
      receiveTimeout="00:20:00" closeTimeout="00:20:00"
      sendTimeout="00:20:00">
      <readerQuotas maxDepth="32" maxStringContentLength="2097152"
        maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" />
    </binding>

तो कृपया इस बाइंडिंग कॉन्फ़िगरेशन को एंडपॉइंट पर लागू करना न भूलें:

<endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding_ACRMS"
      contract="MonitorRAM.IService1" />

यदि उपरोक्त मदद नहीं कर सकता है, तो बेहतर होगा यदि आप अपने मुख्य प्रोजेक्ट को यहां अपलोड करने का प्रयास कर सकते हैं, तो मैं अपने पक्ष में एक परीक्षण करना चाहता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.