【问题标题】:How do I create an exception-wrapping fubumvc behaviour?如何创建包装异常的 fubumvc 行为?
【发布时间】:2011-01-30 14:02:09
【问题描述】:

如何创建一个 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; }
}

【问题讨论】:

    标签: fubumvc


    【解决方案1】:

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

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

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

    当我们添加此功能后,我会在这里评论这个 StackOverflow 问题。

    【讨论】:

    • 仅供参考,如果这很关键,您可以同时自己解决这个问题。如果它不重要(即您在接下来的一两天内需要它),那么我建议您等待它。这周我会尽力为你完成。
    • 乍得,这不是一个紧迫的要求,它更像是一个让我变得更好的实验,我说服自己它应该有效!感谢您的回复。
    • 乔恩:我同意它应该可以工作,这就是为什么我想将它添加到 FubuMVC :)
    • 只是想知道,它现在有效吗?从我的使用中,我感觉它确实......
    猜你喜欢
    • 2011-10-26
    • 2019-01-25
    • 1970-01-01
    • 2015-10-27
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多