3

特定の戻り値の型でアクションをラップする fubumvc 動作を作成するにはどうすればよいですか? アクションの実行中に例外が発生した場合、動作は例外をログに記録し、戻りオブジェクトのいくつかのフィールドにデータを入力しますか? 私は次のことを試しました:

public class JsonExceptionHandlingBehaviour : IActionBehavior
{
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();
    private readonly IActionBehavior _innerBehavior;
    private readonly IFubuRequest _request;

    public JsonExceptionHandlingBehaviour(IActionBehavior innerBehavior, IFubuRequest request)
    {
        _innerBehavior = innerBehavior;
        _request = request;
    }

    public void Invoke()
    {
        try
        {
            _innerBehavior.Invoke();

            var response = _request.Get<AjaxResponse>();
            response.Success = true;
        }
        catch(Exception ex)
        {
            logger.ErrorException("Error processing JSON request", ex);

            var response = _request.Get<AjaxResponse>();
            response.Success = false;
            response.Exception = ex.ToString();
        }
    }

    public void InvokePartial()
    {
        _innerBehavior.InvokePartial();
    }
}

しかし、AjaxResponseリクエストからオブジェクトを取得しても、行った変更はクライアントに送り返されません。また、アクションによってスローされた例外は、これまでのところ成功しません。実行が catch ブロックに到達する前に、リクエストが終了します。私は何を間違っていますか?

完全を期すために、動作は WebRegistry で次のように接続されています。

Policies
    .EnrichCallsWith<JsonExceptionHandlingBehaviour>(action =>
        typeof(AjaxResponse).IsAssignableFrom(action.Method.ReturnType));

AjaxResponse は次のようになります。

public class AjaxResponse
{
    public bool Success { get; set; }
    public object Data { get; set; }
    public string Exception { get; set; }
}
4

1 に答える 1

2

残念ながら、これは現在のバージョンの FubuMVC では動作しません。その理由は、_innerBehavior.Invoke() への呼び出しが、JSON 出力をクライアントに返すための呼び出しを含む、動作チェーンの残りの部分に進むためです。

現在の FubuMVC では、レンダリング出力ビヘイビアーが実行される前に、ビヘイビアーをラップしてその出力を変更することはできません。

これについて Jeremy (Miller) と話したところ、この機能を FubuMVC に追加して、動作チェーン全体 (この場合はアクションを呼び出す動作) をラップするのではなく、特定の動作 (この場合はアクションを呼び出す動作) をラップできるようにします。あなたに今起こっていることです)。

この機能を追加したら、この StackOverflow の質問についてコメントします。

于 2010-03-23T15:01:44.590 に答える