Bật bao gồmExExceptionDetailInFaults (từ ServiceBehaviorAttribution hoặc từ hành vi cấu hình <serviceDebug>) trên máy chủ


157

Tôi có một dịch vụ WCF đã hoạt động hoàn hảo và có gì đó đã thay đổi và tôi không biết gì.

Tôi nhận được ngoại lệ này:

System.ServiceModel.FaultException: Máy chủ không thể xử lý yêu cầu do lỗi nội bộ. Để biết thêm thông tin về lỗi, hãy bật Bao gồmExExceptionDetailInFaults (từ ServiceBehaviorAttribution hoặc từ hành vi cấu hình) trên máy chủ để gửi thông tin ngoại lệ trở lại máy khách hoặc bật theo dõi theo tài liệu SDK của Microsoft .NET Framework 3.0 và kiểm tra nhật ký theo dõi máy chủ.

Điều này gây nhầm lẫn bởi vì tôi đang chạy .NET 4.0.

Tôi bật ở IncludeExceptionDetailInFaultsđâu? Tôi đang chiến đấu để tìm thấy nó.

Câu trả lời:


264

Xác định một hành vi trong .configtệp của bạn :

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

Sau đó áp dụng hành vi cho dịch vụ của bạn dọc theo các dòng sau:

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

Bạn cũng có thể thiết lập nó theo chương trình. Xem câu hỏi này .


1
Xin chào, tôi, trường hợp của tôi có các thư mục lồng nhau chứa các trang web và dịch vụ khác nhau. Thư mục nơi dịch vụ của tôi cư trú và tôi gặp lỗi là ở mức độ thứ ba lồng nhau so với ứng dụng web chính và tôi có web.config dành riêng cho mỗi dịch vụ. Tôi thay đổi web.config tương ứng của mình tương ứng để thêm <serviceDebug includeExceptionDetailInFaults = "true" />. Nhưng tôi vẫn nhận được lỗi. Tôi có cần thay đổi tất cả web.config trong ứng dụng web hoàn chỉnh không?
MaxRecursion

2
@AkshayKulkarni: Không chắc chắn, tôi không có kinh nghiệm với trường hợp của bạn. Hãy chắc chắn rằng các dịch vụ của bạn có tham chiếu đến dịch vụBehavior (kiểm tra câu trả lời của gagogra ) trước. Nếu điều đó không giải quyết được vấn đề, vui lòng đặt câu hỏi về SO.
Otiel

1
@MatthewLock: Cập nhật câu trả lời. Ngoài ra, hãy kiểm tra <behavior><service> nếu bạn cần thêm chi tiết.
Otiel

1
Visual Studio nói với tôi rằng ServiceBehaviors không thể là con trực tiếp của system.serviceModel. Đã kết thúc với câu trả lời của rich.okelly.
andrewb

3
Lưu ý: VS2013 đặt thẻ <serviceDebug> trong Web.config mặc định với nó được đặt thành false. Nếu bạn không chú ý như tôi đã không và thêm XML ở trên rõ ràng những gì cuối cùng trong tệp sẽ thắng. Hy vọng điều này hữu ích cho ai đó ngoài kia.
Jeff

63

Nó nằm trong tệp app.config.

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

9
Không đặt thuộc tính tên của <behavior> (như trong câu trả lời @Otiel) nếu bạn muốn nó áp dụng cho tất cả các dịch vụ của mình.
Pashec

47

Nếu bạn muốn làm điều này bằng mã, bạn có thể thêm hành vi như thế này:

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

Thêm phần này vào ServiceHostđối tượng của bạn : Ví dụ:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

Bạn cũng có thể đặt nó trong thẻ [ServiceBehavior] phía trên khai báo lớp kế thừa giao diện

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

Immortal Blue là chính xác khi không tiết lộ chi tiết ngoại lệ cho phiên bản phát hành công khai, nhưng với mục đích thử nghiệm thì đây là một công cụ tiện dụng. Luôn tắt đi khi phát hành.


Tôi đã sử dụng điều này trong một ứng dụng chạy trên phụ trợ và sẽ không bao giờ có thể xem công khai, vì vậy ứng dụng này hoạt động hoàn hảo
AlbatrossCafe

4

Tôi cũng gặp lỗi tương tự, WCF đã hoạt động đúng với tôi khi tôi sử dụng nó trong Dev Môi trường với thông tin đăng nhập của tôi, nhưng khi có người khác sử dụng nó trong TEST, nó cũng bị lỗi tương tự. Tôi đã thực hiện rất nhiều nghiên cứu, và sau đó thay vì thực hiện cập nhật cấu hình, đã xử lý một ngoại lệ trong phương thức WCF với sự trợ giúp của ngoại lệ lỗi. Ngoài ra, danh tính cho WCF cần phải được đặt với cùng thông tin đăng nhập có cơ sở dữ liệu, ai đó có thể đã thay đổi thẩm quyền của bạn. Vui lòng tìm bên dưới mã cho cùng:

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

trong dịch vụ của bạn1.svc.cs bạn có thể sử dụng điều này trong khối bắt:

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

Và sử dụng điều này trong ứng dụng Client như mã dưới đây:

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

Chỉ cần thử điều này, nó sẽ giúp chắc chắn để có được vấn đề chính xác.


4
Bạn KHÔNG nên để lộ các chi tiết ngoại lệ cơ bản. Toàn bộ mục đích để phân tách các ngoại lệ giữa máy khách và máy chủ và sự cần thiết của cờ này, là để ngăn chặn thông tin ngoại lệ được cung cấp cho máy khách. Người dùng độc hại có thể sử dụng thông tin này để thao túng dịch vụ của bạn! Nếu bạn đang phát triển, hãy sử dụng hành vi Bao gồm ngoại lệDetailInFaults như được mô tả để tuyên truyền toàn bộ ngoại lệ hoặc khi triển khai, đưa ra một lỗi nhận ra một lỗi rất cơ bản, chẳng hạn như "Không thể lưu tệp" thay vì đưa ra dấu vết ngăn xếp và chi tiết đầy đủ của ngoại lệ.
bất tử màu xanh

Xin chào .. trong trường hợp của tôi, tất cả các chức năng dịch vụ khác đang được gọi bởi chức năng mà tôi đang sử dụng để lưu tệp đang ném ngoại lệ đó ... để biết chính xác vấn đề tôi đã sử dụng hệ thống ghi nhật ký nhưng không có nhật ký nào được tạo cho phương thức đó ... tôi đang tạo 3 bản ghi 1) khi dịch vụ đạt 2) trước khi lưu bất kỳ tệp nào và 3) nhật ký ngoại lệ.
user3217843

0

Như thông tin lỗi đã nói trước, vui lòng cố gắng tăng giá trị thời gian chờ ở cả phía máy khách và phía dịch vụ như sau:

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

Sau đó, đừng quên áp dụng cấu hình ràng buộc này cho điểm cuối bằng cách thực hiện như sau:

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

Nếu những điều trên không thể giúp được, sẽ tốt hơn nếu bạn có thể cố gắng tải lên dự án chính của mình ở đây, sau đó tôi muốn có một bài kiểm tra ở bên tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.