2009-07-01 33 views
5

Đây là phong bì trả lời của tôi:Lỗi đánh máy WCF và mã lỗi máy chủ nội bộ 500?

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <s:Fault> 
     <faultcode>s:Client</faultcode> 
     <faultstring xml:lang="en-US">The creator of this fault did not specify a Reason.</faultstring> 
     <detail> 
      <ServiceFault xmlns="http://schemas.datacontract.org/2004/07/Zagat.Services.FaultException" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <ReasonCollection xmlns:a="http://schemas.datacontract.org/2004/07/Zagat.Enterprise.Domain"/> 
       <ReasonMessage>Credentials are not valid</ReasonMessage> 
      </ServiceFault> 
     </detail> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 
enter code here 

Dưới đây là Tiêu đề của tôi:

HTTP/1.1 500 Internal Server Error 
Date: Wed, 01 Jul 2009 17:55:33 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private 
Content-Type: text/xml; charset=utf-8 
Content-Length: 564 

Làm thế nào tôi có thể nhận được IIS để trả về một 200 thay vì 500? Mã của tôi chạy trên máy chủ, tôi chỉ gửi một lỗi cho khách hàng để xử lý.

Daniel

+0

Bạn có nhận được thông báo đó trong một ProtocolException không? Tôi đã có một vấn đề với những trường hợp ngoại lệ gây ra tôi luôn luôn có mã html trong thông điệp ngoại lệ. Bây giờ tôi chỉ giả định rằng mọi ngoại lệ giao thức đi kèm với mã html này và tôi phân tích nó để nhận được thông điệp thực. http://stackoverflow.com/questions/998065/does-system-servicemodel-protocolexception-always-have-html-code-in-its-message – sebagomez

Trả lời

5

Bạn có thể dễ dàng tùy chỉnh xử lý lỗi của WCF. Xem Modifying HTTP Error Codes, Part 1Part 2 bởi Blog Indigo của Nicholas Allen; WCF: Throwing Exceptions With WebHttpBinding bởi Andre de Cavaignac; và Exception Handling in WCF Web Service bởi Brajendra Singh.

+0

Chắc chắn, nhưng nếu bạn đặt thành 200, khách hàng sẽ nhận ra nó? –

+0

Tôi đã thấy các tùy chọn trong khung công tác khác cho phép bạn chọn từ 500 đến 200. Tôi nghĩ đó là SOAP của Delphi. Khi tôi xử lý lỗi, tôi đã tạo một dịch vụ hoạt động như SOAP và REST, vì vậy tôi đã làm 500 cho SOAP và 401,403,404, v.v. cho REST. –

+0

Ok, nhưng bạn có trả về lỗi SOAP cho REST không? Trả về những gì bạn thích cho REST, nhưng giao thức SOAP giới hạn các mã HTTP nào có thể được sử dụng trong hoàn cảnh nào. Nếu bạn muốn trả về cái gì đó _looks_ nhiều hơn hoặc ít hơn như một lỗi SOAP, nhưng không phải là _be_ một, thì hãy bắt ngoại lệ và chỉ trả về XML tùy chỉnh của riêng bạn. Nhưng nếu bạn mong đợi máy khách nhìn thấy lỗi SOAP của bạn dưới dạng lỗi SOAP, bạn cần sử dụng mã trạng thái chính xác. –

1

hồi ức của tôi về Nghị định thư SOAP là lỗi sẽ được gửi dưới dạng mã 500.

Lỗi không phản hồi thành công. Họ chỉ ra bản chất của sự thất bại.

Các vấn đề liên quan