1

我正在努力让 AsyncController 在 OrchardProject 中工作。我正在使用的当前版本是 2.2.4.9.0。

我有两个人关注我的代码: http: //www.pastie.org/2117952 (AsyncController),它在常规的 MVC3 vanilla 应用程序中运行良好。

基本上,我可以路由到 IndexCompleted,但我不能路由到 Index。我将假设我在整个项目的 Autofac 配置中遗漏了一些东西。

我认为配置在 global.asax 中:http: //pastie.org/2118008

我正在寻找的是一些指导,说明这是否是为 AsyncControllers 实现 autofac 的正确方法,或者是否有其他东西/其他地方我需要实现/初始化/等。

~丹

4

4 回答 4

2

Orchard 似乎注册了自己的IActionInvoker,称为Orchard.Mvc.Filters.FilterResolvingActionInvoker

这个类派生自ControllerActionInvoker. 猜测一下,为了支持异步操作,它应该从AsyncControllerActionInvoker.

希望这可以帮助!

缺口

于 2011-07-05T21:40:21.753 回答
0

Autofac 设置看起来不错,只要您可以导航到某些东西,我就不能说您的假设是有道理的。此外,您在 global.asax 中用于初始化的模式也被其他人使用。

在您的AsyncController情况下,要求 async 方法成对出现IndexAsync& IndexCompleted。这些共同代表Index行动。当您说您可以导航到 IndexCompleted 时,您的意思是您打开了一个 url “..../IndexCompleted”吗?

另外,我无法从任何文档中确认这一点,但我猜这AsyncController需要所有操作都是异步的。因此,您的NewMessage操作会导致麻烦,应转换为 async NewMessageAsync& NewMessageCompletedpair。

于 2011-06-29T12:48:17.510 回答
0

我也确实需要拥有AsyncController它,我很容易将其更改FilterResolvingActionInvoker为基于AsyncControllerActionInvoker而不是ControllerActionInvoker.

但是由于请求完成后自动处理事务,还存在其他问题。在AsyncController启动线程和完成请求的线程可能不同,这会在TransactionManager类的 Dispose 方法中引发以下异常:

ATransactionScope必须在创建它的同一线程上处理。

这个异常在没有任何日志记录的情况下被抑制,真的很难发现。在这种情况下,会话保持未处理,后续会话将超时。
因此,我公开了 dispose 方法ITransactionManager,现在在我AsyncController的 .

using (_services.TransactionManager) {
    .....
}

新事务管理器:

public interface ITransactionManager : IDependency, IDisposable {
    void Demand();
    void Cancel();
}

public class TransactionManager : ITransactionManager {
    private TransactionScope _scope;
    private bool _cancelled;

    public TransactionManager() {
        Logger = NullLogger.Instance;
    }

    public ILogger Logger { get; set; }

    public void Demand() {
        if (_scope == null) {
            Logger.Debug("Creating transaction on Demand");
            _scope = new TransactionScope(
                TransactionScopeOption.Required, 
                new TransactionOptions { 
                    IsolationLevel = IsolationLevel.ReadCommitted 
                });
            _cancelled = false;
        }
    }

    void ITransactionManager.Cancel() {
        Logger.Debug("Transaction cancelled flag set");
        _cancelled = true;
    }

    void IDisposable.Dispose() {
        if (_scope != null) {
            if (!_cancelled) {
                Logger.Debug("Marking transaction as complete");
                _scope.Complete();
            }

            Logger.Debug("Final work for transaction being performed");
            try {
                _scope.Dispose();
            }
            catch {
                // swallowing the exception
            }
            Logger.Debug("Transaction disposed");
        }
        _scope = null;
    }
}

请注意,我对TransactionManager.

于 2012-05-15T10:30:25.717 回答
0

我也尝试了 AsyncControllerActionInvoker 路由,但无济于事。我会从 Orchard 本身收到间歇性错误,并出现以下错误:

Orchard.Exceptions.DefaultExceptionPolicy - An unexpected exception was caught
System.TimeoutException: The operation has timed out.
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.ReflectedAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3f.<BeginInvokeAsynchronousActionMethod>b__3e(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
NHibernate.Util.ADOExceptionReporter - While preparing SELECT this_.Id as Id236_2_, this_.Number as Number236_2_,...<blah blah blah>
NHibernate.Util.ADOExceptionReporter - The connection object can not be enlisted in transaction scope.

所以我不认为仅仅用事务对象包装你自己的数据库调用会有帮助。果园的内脏也必须修改。

如果您希望 Orchard 支持 AsyncControllers,请为这个问题投票:

https://orchard.codeplex.com/workitem/18012

于 2013-06-01T04:13:47.043 回答