Aktifkan IncludeExceptionDetailInFaults (baik dari ServiceBehaviorAttribute atau dari perilaku konfigurasi <serviceDebug>) di server

157

Saya memiliki layanan WCF yang telah bekerja dengan sempurna, dan ada sesuatu yang berubah dan saya tidak tahu apa.

Saya mendapatkan pengecualian ini:

System.ServiceModel.FaultException: Server tidak dapat memproses permintaan karena kesalahan internal. Untuk informasi lebih lanjut tentang kesalahan, nyalakan IncludeExceptionDetailInFaults (baik dari ServiceBehaviorAttribute atau dari perilaku konfigurasi) di server untuk mengirim informasi pengecualian kembali ke klien, atau nyalakan pelacakan sesuai dokumentasi Microsoft .NET Framework 3.0 SDK dan periksa log penelusuran server.

Ini membingungkan karena saya menjalankan .NET 4.0.

Di mana saya menghidupkan IncludeExceptionDetailInFaults? Saya berjuang untuk menemukannya.

Trevor
sumber

Jawaban:

265

Tetapkan perilaku dalam .configfile Anda :

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

Kemudian terapkan perilaku tersebut ke layanan Anda di sepanjang baris ini:

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

Anda juga dapat mengaturnya secara terprogram. Lihat pertanyaan ini .

Otiel
sumber
1
Hai Otivel, saya kasus saya ada folder bersarang yang berisi berbagai situs dan layanan. Folder tempat layanan saya berada dan saya mendapatkan kesalahan berada pada tingkat ketiga bersarang relatif terhadap aplikasi web utama dan saya telah mendedikasikan web.config untuk setiap layanan. Saya mengubah web.config terkait saya untuk menambahkan <serviceDebug includeExceptionDetailInFaults = "true" />. Tapi saya masih mendapatkan kesalahan. Apakah saya perlu mengubah semua web.config dalam aplikasi web yang lengkap?
MaxRecursion
2
@AkshayKulkarni: Tidak yakin, saya tidak punya pengalaman dengan kasus Anda. Pastikan layanan Anda memiliki referensi ke serviceBehavior (periksa jawaban gagogra ) terlebih dahulu. Jika itu tidak menyelesaikan masalah, silakan ajukan pertanyaan pada SO.
Otiel
1
@ MatthewLock: Jawaban yang diperbarui. Juga, periksa <behavior> dan <service> jika Anda membutuhkan detail lebih lanjut.
Otiel
1
Visual Studio memberi tahu saya bahwa serviceBehaviors tidak bisa menjadi anak langsung dari system.serviceModel. Akhirnya pergi dengan jawaban rich.okelly.
andrewb
3
Catatan: VS2013 menempatkan tag <serviceDebug> di Web.config default dengan itu disetel ke false. Jika Anda tidak melihat seperti saya tidak dan menambahkan XML di atas ternyata apa yang terakhir dalam file menang. Semoga ini bermanfaat bagi seseorang di luar sana.
Jeff
63

Ada dalam file app.config.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>
Rich O'Kelly
sumber
9
Jangan setel atribut nama <behavior> (seperti pada jawaban @Otiel) jika Anda ingin itu berlaku untuk semua layanan Anda.
Pashec
47

Jika Anda ingin melakukan ini dengan kode, Anda dapat menambahkan perilaku seperti ini:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
Yang Zhang
sumber
Tambahkan ini ke ServiceHostobjek contoh Anda: Contoh:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti
28

Anda juga dapat mengaturnya di tag [ServiceBehavior] di atas deklarasi kelas Anda yang mewarisi antarmuka

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

Immortal Blue benar dalam tidak mengungkapkan rincian pengecualian ke versi yang dirilis untuk umum, tetapi untuk tujuan pengujian ini adalah alat yang berguna. Selalu matikan saat melepaskan.

LievenV
sumber
Saya menggunakan ini dalam aplikasi yang berjalan di backend dan tidak akan pernah dapat dilihat secara publik, jadi ini berfungsi dengan baik
AlbatrossCafe
4

Saya juga mendapatkan kesalahan yang sama, WCF bekerja dengan baik untuk saya ketika saya menggunakannya di Lingkungan Dev dengan kredensial saya, tetapi ketika orang lain menggunakannya di TEST, itu melempar kesalahan yang sama. Saya melakukan banyak penelitian, dan bukannya melakukan pembaruan konfigurasi, menangani pengecualian dalam metode WCF dengan bantuan pengecualian kesalahan. Juga identitas untuk WCF perlu ditetapkan dengan kredensial yang sama yang memiliki akses dalam database, seseorang mungkin telah mengubah otoritas Anda. Silakan temukan di bawah kode yang sama:

 [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; }
}

di service1.svc.cs Anda, Anda bisa menggunakan ini di catch catch:

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

Dan gunakan ini dalam aplikasi Klien seperti kode di bawah ini:

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

Coba saja ini, pasti akan membantu untuk mendapatkan masalah yang tepat.

Aditya
sumber
4
Anda TIDAK boleh mengekspos detail pengecualian yang mendasarinya. Seluruh tujuan untuk pemisahan pengecualian antara klien dan server dan perlunya flag ini sama sekali, adalah untuk mencegah informasi pengecualian disediakan untuk klien. Seorang pengguna jahat dapat menggunakan informasi ini untuk memanipulasi layanan Anda! Jika Anda mengembangkan, gunakan perilaku IncludeExceptionDetailInFaults seperti yang dijelaskan untuk menyebarkan seluruh pengecualian, atau dalam penyebaran, naikkan kesalahan ekspresi memberikan kesalahan yang sangat mendasar, seperti "Tidak dapat menyimpan file" daripada memberikan jejak stack dan rincian lengkap dari pengecualian.
Immortal Blue
Hai .. dalam kasus saya semua fungsi layanan lainnya dipanggil oleh fungsi yang saya gunakan untuk menyimpan file melemparkan pengecualian itu ... untuk mengetahui masalah yang tepat saya menggunakan sistem logging tetapi tidak ada log yang dibuat untuk metode itu ... Saya membuat 3 log 1) ketika layanan menekan 2) sebelum menyimpan file dan 3) log pengecualian.
user3217843
0

Seperti yang dikatakan informasi kesalahan terlebih dahulu, cobalah untuk meningkatkan nilai batas waktu di sisi klien dan layanan sebagai berikut:

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

Maka jangan lupa untuk menerapkan konfigurasi yang mengikat ini ke titik akhir dengan melakukan hal berikut:

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

Jika hal di atas tidak dapat membantu, akan lebih baik jika Anda dapat mencoba mengunggah proyek utama Anda di sini, maka saya ingin memiliki tes di pihak saya.

Muhammad Mohsin Muneer
sumber