クラシックによってクライアントで消費される WCF REST サービスがあります。
WebResponse response = request.GetResponse();
サービスに表示されるエラーをインターセプトして、クライアントに配信したいと考えています。デフォルトの動作では、サービスで例外が発生すると faultexception がスローされ、チャネルに障害が発生するため、クライアントで Bad リクエストを受け取ります。クライアントにスタックトレースを返し、動作をオーバーライドしてチャネルに障害が発生しないようにしたいと考えています。そのために、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);
}
}
問題は、これをサービスに登録しても、エラーハンドラーをデバッグできますが、チャネルにはまだ障害があるため、クライアントで不正な要求を受け取ります。クライアントには次のファクトリを使用します。
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;
}
問題は、エラーハンドラーでチャネルがエラーになるのをどのように防ぐことができるかです。