3

IIS でホストする WCF Rest サービスを開発しています。

現在、サービス コントラクトを実装しています。例外を処理しようとすると、すべてのメソッドで同じコードを繰り返していることがわかります。

これは、私のサービス契約方法の 1 つです。

public void DeleteMessage(string message_id)
{
    int messageId;
    OutgoingWebResponseContext ctx =
        WebOperationContext.Current.OutgoingResponse;

    if ((message_id == null) || (!Int32.TryParse(message_id, out messageId)) || (messageId < 1))
    {
        ctx.StatusCode = System.Net.HttpStatusCode.BadRequest;
        ctx.StatusDescription = "message_id parameter is not valid";
        throw new ArgumentException("DeleteMessage: message_id is not valid", "message_id");
    }

    try
    {
        using (var context = new AdnLineContext())
        {
            Message message = new Message() { MessageId = messageId };

            context.Entry(message).State = EntityState.Deleted;
            context.SaveChanges();

            ctx.StatusCode = System.Net.HttpStatusCode.OK;
        }
    }
    catch (Exception ex)
    {
        ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError;
        ctx.StatusDescription = ex.Message;
        ctx.SuppressEntityBody = true;
    }
}

ArgumentExceptionすべてのメソッドで、またはをスローし、Exceptionそれらを return a で管理できますHTTP STATUS CODE

その例外をグローバルにキャッチする方法はありますか?

4

2 に答える 2

2

MS が推奨するアプローチは、FaultExceptionパターンに従っているようです。アイデアは、IErrorHandlerインターフェイスを実装することです。この回答では、WCF 構成で設定する方法について説明しています。

古いスタイルの WCF サービスでこのパターンの実装を見たので、おそらく複雑なエンタープライズ レベルのシナリオでのみ意味があると言えます。単純なケースでは、手動で例外をスローすることに固執します。

もう 1 つの方法は、REST サービスをWeb APIで実装することです。すぐに使用できる優れた例外処理戦略があり、Microsoft が.NET Technology Guide for Business Applicationsで REST 開発に実際に推奨しているものです。

于 2013-08-08T12:49:59.890 に答える
0

WCF には、例外をエラーに変換するための優れた拡張メカニズムが組み込まれています。この拡張ポイントは、HandleError と ProvideFault の 2 つのメソッドを提供する IErrorHandler インターフェイスを介して使用できます。HandleError メソッドは、呼び出しが完了した後に別のスレッドで呼び出され、エラーをログに記録し、他の操作を実行する可能性があります。以下は便利なリンクです

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.providefault.aspx

サービス web.config ファイルの LoggingConfiguration セクションは、エラーをログに記録する別のオプションです。

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

于 2013-08-08T13:40:12.443 に答える