如何创建异常包装fubumvc行为?

时间:2010-03-22 23:11:37

标签: fubumvc

如何创建包含特定返回类型操作的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; }
}

1 个答案:

答案 0 :(得分:2)

不幸的是,这不适用于当前版本的FubuMVC。原因是对_innerBehavior.Invoke()的调用将继续执行行为链的其余部分,包括将JSON输出呈现给客户端的调用。

使用当前的FubuMVC,您无法在执行渲染输出行为之前包装行为并修改其输出。

我刚刚与Jeremy(Miller)讨论了这个问题,我们将把这个功能添加到FubuMVC中,以便您可以包装特定的行为(在这种情况下,调用操作的行为)而不是包装整个行为链(这就是你现在正在发生的事情)。

当我们添加此功能时,我会在此回复此StackOverflow问题。