Sunucudaki IncludeExceptionDetailInFaults'u (ServiceBehaviorAttribute veya <serviceDebug> yapılandırma davranışından) açın


157

Mükemmel çalışan bir WCF hizmetim var ve bir şeyler değişti ve ne olduğunu bilmiyorum.

Bu istisnayı alıyorum:

System.ServiceModel.FaultException: Sunucu, bir iç hata nedeniyle isteği işleyemedi. Hata hakkında daha fazla bilgi için, özel durum bilgilerini istemciye geri göndermek üzere sunucuda IncludeExceptionDetailInFaults'u (ServiceBehaviorAttribute veya yapılandırma davranışından) açın veya Microsoft .NET Framework 3.0 SDK belgelerine göre izlemeyi açın ve sunucu izleme günlüklerini inceleyin.

.NET 4.0 çalıştırdığım için bu kafa karıştırıcı.

Nerede açarım IncludeExceptionDetailInFaults? Onu bulmak için savaşıyorum.

Yanıtlar:


265

Bir tanımlama davranışı sizin de .configdosyaya:

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

Ardından davranışı hizmetinize şu satırlar boyunca uygulayın:

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

Programlı olarak da ayarlayabilirsiniz. Bu soruya bakın .


1
Merhaba Otivel, benim durumumda farklı site ve hizmetler içeren iç içe klasörler var. Hizmetimin bulunduğu ve hata alıyorum klasör ana web uygulamasına göre üçüncü yuvalama derecesinde ve her hizmet için özel web.config var. Ben karşılık gelen web.config <serviceDebug includeExceptionDetailInFaults = "true" /> eklemek için buna göre değiştirin. Ama hala hatayı alıyorum. Tam web uygulamasında tüm web.config dosyasını değiştirmem gerekir mi?
MaxRecursion

2
@AkshayKulkarni: Emin değilim, davanızla ilgili deneyimim yok. Öncelikle hizmetlerinizin serviceBehavior'a ( gagogra yanıtını kontrol edin ) referans olduğundan emin olun . Bu sorunu çözmezse, lütfen SO hakkında bir soru sorun.
Kasım'da Otiel

1
@ MatthewLock: Güncelleme cevabı. Ayrıca, daha fazla ayrıntıya ihtiyacınız varsa <davranış> ve <hizmet> öğelerini kontrol edin .
Otiel

1
Visual Studio, serviceBehaviors'ın system.serviceModel öğesinin doğrudan alt öğesi olamayacağını söylüyor. Zengin ile sona erdi. Okelly'nin cevabı.
andrewb

3
Not: VS2013, varsayılan Web.config dosyasına <serviceDebug> etiketini false olarak ayarlanmış olarak koyar. Eğer fark etmedim gibi fark ve yukarıdaki XML eklemek görünüşe göre dosyada son ne kazanır. Umarım bu orada birileri için yararlıdır.
Jeff

63

App.config dosyasındadır.

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

9
Tüm hizmetlerinize uygulanmasını istiyorsanız, <behavior> ad özniteliğini (@Otiel yanıtında olduğu gibi) ayarlamayın.
Pashec

47

Bunu kodla yapmak istiyorsanız, aşağıdaki gibi davranışı ekleyebilirsiniz:

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

Bunu ServiceHostnesne örneğinize ekleyin : Örnek:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

Arabirimi devralan sınıf bildiriminizin üzerindeki [ServiceBehavior] etiketinde de ayarlayabilirsiniz.

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

Ölümsüz Mavi, istisna ayrıntılarını herkese açık olarak yayınlanan bir versiyona açıklamada doğru değildir, ancak test amacıyla bu kullanışlı bir araçtır. Serbest bırakırken daima kapatın.


Bunu arka uç üzerinde çalışan bir uygulamada kullandım ve asla kamuya açık olmayacak, bu yüzden mükemmel çalışıyor
AlbatrossCafe

4

Aynı hatayı alıyordum, WCF, Dev Ortamında kimlik bilgilerimle kullanırken benim için düzgün çalışıyordu, ancak başka biri TEST'te kullanırken, aynı hatayı atıyordu. Çok fazla araştırma yaptım ve ardından yapılandırma güncellemeleri yapmak yerine, WCF yönteminde hata istisnası yardımıyla bir istisna ele aldım. Ayrıca WCF kimliğinin veritabanında erişimi olan aynı kimlik bilgileriyle ayarlanması gerekir, birisi otoritenizi değiştirmiş olabilir. Lütfen aynı kodu aşağıda bulabilirsiniz:

 [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 dosyasında bunu catch bloğunda kullanabilirsiniz:

 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());
        }

Ve bunu aşağıdaki uygulama gibi İstemci uygulamasında kullanın:

  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();
      }

Sadece bunu deneyin, kesin sorunu almanıza yardımcı olacaktır.


4
Temel istisna ayrıntılarını GÖSTERMEMELİSİNİZ. İstemci ve sunucu arasındaki istisnaların ayrılması ve bu bayrağa ihtiyaç duyulmasının amacı, istisna bilgilerinin istemcinin kullanımına sunulmasını önlemektir. Kötü niyetli bir kullanıcı hizmetinizi değiştirmek için bu bilgileri kullanabilir! Geliştiriyorsanız, tüm istisnayı yaymak veya dağıtımda IncludeExceptionDetailInFaults davranışını açıklandığı gibi, yığın izlemesi ve tüm ayrıntılarını vermek yerine "Dosya kaydedilemedi" gibi çok temel bir hata vererek bir hata belirtisi oluşturun. istisna.
Ölümsüz Mavi

Merhaba .. benim durumumda diğer tüm hizmet işlevi dosyayı kaydetmek için kullanarak im işlevi tarafından çağrılıyor istisna atıyor ... kesin sorunu bilmek için ben günlük sistemi kullanılan ama bu yöntem için hiçbir günlük oluşturulur ... im 3 günlük oluşturma 1) hizmet 2) herhangi bir dosyayı kaydetmeden önce ve 3) istisna günlüğü.
user3217843

0

Hata bilgilerinin ilk söylediği gibi, hem istemci tarafında hem de hizmet tarafında zaman aşımı değerini aşağıdaki gibi artırmaya çalışın:

<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>

Ardından, bu bağlayıcı yapılandırmayı aşağıdakileri yaparak uç noktaya uygulamayı unutmayın:

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

Yukarıdakiler yardımcı olamazsa, ana projenizi buraya yüklemeyi deneyebilirseniz daha iyi olacaktır, o zaman yanımda bir test yapmak istiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.