カスタムIErrorHandlerを使用してREST WCFサービスを使用しているため、サービスで未知の例外がすべて検出され、カスタムエラーメッセージ、適切なHttpステータスコード(500)エラー。IErrorHandlerを使用したREST WCFサービスはSerializationExceptionsをキャッチします
問題は、IErrorHandlerが自分のコードから発生した例外を捕捉するため、たとえば無効なJSONデータを持つサービスにPOSTを実行すると、SerializationExceptionが発生します。この例外はIERrorHandlerのためのものでなければ、ステータスコードBadRequest 400を持つWebFaultExceptionに変換されていました。他のすべての未知の例外と同様に扱います。
このような状況を処理する方法はありますか?IErrorHandlerでSerializationExceptionsをキャッチしてBadRequestを設定するだけですか?私のコードから抜粋せずにWCFスタックから他の例外を取り除くことができますか?
更新:は、私は同様の問題に遭遇したIErrorHandler.ProvideFault
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
Guid loggingId = Guid.NewGuid();
error.Data["ExceptionLoggingId"] = loggingId;
if (error is SecurityTokenException)
{
fault = Message.CreateMessage(version, string.Empty, String.Format("{0}. The error identifier is {1}", error.Message, loggingId), new DataContractJsonSerializer(typeof(string)));
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
webOperationContextWrapper.SetOutgoingResponseStatusCode(HttpStatusCode.Unauthorized);
}
else
{
if (error is SerializationException)
{
// TODO: What if the SerializationException originates from within the service?
// SerializationException due to malformed JSON
return;
}
fault = Message.CreateMessage(version, string.Empty, String.Format("An unknown error has occurred. The error identifier is {0}", loggingId), new DataContractJsonSerializer(typeof(string)));
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
webOperationContextWrapper.SetOutgoingResponseStatusCode(HttpStatusCode.InternalServerError);
}
}
ProvideFaultにフォルトメッセージを割り当てないとどうなりますか? –
それは期待どおりに動作します。クライアントはhttpステータスコード400を受け取ります。しかし、IErrorHandlerでSerializationExceptionsをチェックする必要があります。しかし、SerializationExceptionがWCFスタックからではなく私のサービスから来ている場合は、サーバーエラーです(いくつかのシリアル化は間違っています)。ステータスコード500を返したいと思いますか? – Joel
私の意図を明確にするために私の実装を追加しました – Joel