2013-05-17 151 views
0

我有一個由傳統的客戶機上消耗WCF REST服務:WCF REST服務IErrorHandler

WebResponse response = request.GetResponse(); 

我想攔截出現在服務,並提供給客戶的任何錯誤。根據默認行爲,當服務中發生異常時會引發Faultexception並且通道出現故障,因此在客戶端上,我收到一個Bad請求。 我希望能夠返回客戶端stackstrace並覆蓋行爲不會錯誤的渠道。 對於我已經實現了IErrorHandler

public class ErrorHandler : IErrorHandler 
    { 
     public bool HandleError(Exception error) 
     { 

      return true; 
     } 

     public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
     { 

      fault = Message.CreateMessage(version, string.Empty, String.Format("An unknown error has occurred. The error identifier "), new DataContractJsonSerializer(typeof(string))); 
      fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json)); 
      fault.Properties.Add(HttpResponseMessageProperty.Name, HttpStatusCode.Accepted); 

     } 
} 

的問題是,即使我註冊此的服務,我可以調試的ErrorHandler,但渠道依然出現故障,所以我仍然收到客戶端錯誤請求。 我用下面的工廠爲客戶:

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      var host = base.CreateServiceHost(serviceType, baseAddresses); 

      ServiceEndpoint ep = host.AddServiceEndpoint(serviceType, new WebHttpBinding(), ""); 
      host.Description.Endpoints[0].Behaviors.Add(new WebHttpBehavior { HelpEnabled = true });  
      return host; 


     } 

的問題是我怎麼能防止在得到的ErrorHandler故障的通道。

回答

0

它應該工作。我遇到了同樣的情況,並且在ProvideFault方法中也設置了錯誤。我能想到的唯一的事情是,我沒有看到你創建了一個FaultException,你可以從中調用CreateMessageFault()。

下面是一個例子:

public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault) 
{ 
    // we don't want the communication channel to fault, so we'll provide a general purpose fault with the exception provided. 
    var fe = new FaultException(error.Message); 
    MessageFault msg = fe.CreateMessageFault(); 
    fault = Message.CreateMessage(version, msg, "YourActionNamespace"); 
}