2013-04-09 31 views
56

Tôi đã sau đây được trang trí trên dịch vụ của tôiWCF ExceptionShielding Lỗi ID không phù hợp với handlingInstanceId truyền cho Handler

<ExceptionShielding("MyExceptionPolicyName")> 

khi một ngoại lệ lỗi được ném, chính sách của tôi nhặt lỗi và bản ghi trong tốt. Nó lấy id handlingInstance và ghi lại nó cùng với lỗi để tham khảo. Những gì tôi nhận thấy, là Guid quay trở lại trong lỗi "Lỗi ID:" là khác với một trong những thông qua vào instanceId xử lý.

Tôi cũng đã cố gắng để trang trí các hoạt động như vậy

<FaultContract(GetType(ValidationFault))> 

nhưng điều này tạo ra kết quả tương tự.

Điều tôi muốn làm là một số cách chụp rằng "ID lỗi:" được trả lại cho người tiêu dùng để tôi có thể ghi lại cùng với ngoại lệ. * thông tin bổ sung: trình xử lý chính sách ngoại lệ là trình xử lý tùy chỉnh có ngoại lệ và ghi lại các thuộc tính và dữ liệu khác nhau của nó vào một lược đồ db đăng nhập ngoại lệ cụ thể.

Bất kỳ ai biết cách thực hiện điều này?

UPDATE: mỗi comment @ Jay Patel 's, tôi đã thêm này để cấu hình của tôi để cho phép truy tìm

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "c:\Temp\Traces.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

sau đó tôi thực hiện một yêu cầu để có được một phản ứng lỗi che chắn bởi ngoại lệ che chắn. Chuỗi phản hồi lỗi được định dạng như vậy: "Đã xảy ra lỗi khi sử dụng dịch vụ này. Vui lòng liên hệ với quản trị viên của bạn để biết thêm thông tin. ID lỗi: {GUID}"

Sau đó tôi xem nhật ký theo dõi và không tìm thấy bằng chứng của GUID hoặc chuỗi này.

Đây là liên kết pastebin đến tracelog cho bất kỳ ai quan tâm để xem ví dụ về một khi sử dụng ExceptionShielding.

UPDATE2:

Một lần nữa, mỗi comment @ Jay Patel, bổ sung này. Tôi đã thử -1 và giá trị int tối đa cho maxMessageLog để đảm bảo tôi nhận được lượng dữ liệu lớn nhất trong nhật ký đó.

<diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" /> 
</diagnostics> 

Nhật ký không hữu ích. Nó bao gồm không có gì về mọi thứ thậm chí gần trả lời câu hỏi của tôi.

Để làm rõ trong trường hợp không rõ ràng ở trên ... Tôi muốn có thể nắm bắt GUID sau "ID lỗi:" trong thư gửi lại cho khách hàng để tôi có thể đăng nhập với ngoại lệ được ghi bởi trình xử lý ngoại lệ. Bằng cách này, khách hàng có thể liên hệ với "Quản trị viên" như thông báo nói với ID lỗi và thực sự có thể tìm thấy thứ gì đó.

Dưới đây là toàn bộ dấu vết kích hoạt pastbin

+0

Vì vậy, tôi đã đặt một khoản tiền thưởng một lần vào tài khoản này. Nếu ai đó đi cùng với một câu trả lời tại một thời điểm nào đó, tôi sẽ làm những gì tôi có thể từ bỏ 50 điểm thưởng cho họ (tôi thậm chí không chắc liệu bạn có thể làm điều này không, nhưng nếu một câu trả lời đến và tôi thích nó, Tôi sẽ đăng một phần thưởng và thưởng cho người đó ... nếu đó không phải là không có ở đây trên ngăn xếp ... tốt ... Tôi sẽ cho bạn một cao ảo năm và nói cảm ơn bạn :) – wakurth

+1

Không phải là nó sẽ giúp đỡ, nhưng có bạn cố gắng đăng nhập bằng cách sử dụng Tracing trong [WCF Tracing] (http://msdn.microsoft.com/en-us/library/ms733025.aspx) Bạn có thấy ID lỗi giống nhau ở đây không? –

+0

Tôi không có. Tôi sẽ kiểm tra nó. Công ty tôi làm việc không có liên hệ tại MS, tôi đã gửi câu hỏi này đến và được thông báo rằng họ sẽ chuyển câu hỏi đó cho nhóm EntLib tại MS và trả lời tôi. Trong thời gian đó, tôi sẽ thử WCF Tracing và xem nó có giúp chỉ cho tôi hướng dẫn cách nắm bắt giá trị này ở phía máy chủ hay không. cảm ơn. – wakurth

Trả lời

1

Theo http://msdn.microsoft.com/en-us/library/ff649012.aspx:

Bạn cũng có thể chỉ định Nguồn là "{GUID}" để thêm dòng Xử lý Instance ID đến tài sản Fault Hợp đồng.

Trong file .config của bạn:

<mappings> 
    <add source="{Guid}" name="HandlingInstanceId" /> 
</mappings> 

Trong ValidationFault FaultContract của bạn:

[DataMember] 
public Guid HandlingInstanceId { get; set; } 

Lưu ý: "{GUID}" nguồn dường như là một dấu hiệu đặc biệt cho các Xử lý Instance ID.

Xem thêm: http://entlib.codeplex.com/discussions/232049

Và, 2 mục cuối cùng: http://entlib.codeplex.com/discussions/243558

+0

Điều này cho biết thêm nó (id cá thể xử lý) đối với lỗi xác thực được trả lại cho người tiêu dùng, nhưng không giúp tôi với câu hỏi của tôi, đó là cách nắm bắt "ID lỗi: {GUID}". Việc nắm bắt GUID đó cụ thể là những gì tôi đã nêu trong câu hỏi – wakurth

1

là thông điệp logging sẽ rất hữu ích? Nếu vì vậy tôi đoán bạn cần một cái gì đó như thế này trong cấu hình của bạn:

<source name ="System.ServiceModel.MessageLogging" 
     switchValue="Verbose, ActivityTracing">   
<listeners> 
    <add name="xml" /> 
</listeners> 

Xin lưu ý rằng tên nguồn ở đây là 'System.ServiceModel.MessageLogging' chứ không phải 'System.ServiceModel'.

Để có ví dụ đầy đủ, vui lòng xem bài viết này: http://msdn.microsoft.com/en-us/library/dd788183.aspx

Hy vọng điều này sẽ giúp bạn.