【问题标题】:How to force HttpModule Init() method call for all new thread如何强制为所有新线程调用 HttpModule Init() 方法
【发布时间】:2014-04-16 19:50:01
【问题描述】:

我没有开发 asp.net 应用程序的经验。

我想开发一个使用 Componente COM 且 SxS 免注册的 Web 应用程序。

按照这个MSDN Article, Http Module,我实现了一个HttpModule

    public class SyncModule : IHttpModule
{    
    private MyEventHandler _eventHandler = null;

    public void Init(HttpApplication app)
    {
        app.BeginRequest += new EventHandler(OnBeginRequest);

// Code that enable COM SxS registration-free
        EnableSxSForThisThread_with_CreateActCtx();

        int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
        Debug.WriteLine("MyModule Thread Id: " + id);
    }

    public void Dispose() {    }

    public delegate void MyEventHandler(Object s, EventArgs e);

    public event MyEventHandler MyEvent
    {
        add { _eventHandler += value; }
        remove { _eventHandler -= value; }
    }

    public void OnBeginRequest(Object s, EventArgs e)
    {
        HttpApplication app = s as HttpApplication;
        int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
        Debug.WriteLine("OnBeginRequest Thread Id: " + id);
        Debug.WriteLine("OnBeginRequest: Hello from OnBeginRequest in custom module.<br>");
        if (_eventHandler != null)
            _eventHandler(this, null);
    }

注意打印线程 ID。

public void Init(HttpApplication app)
{
...
    int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
    Debug.WriteLine("MyModule Thread Id: " + id);
}

我链接到我的网络应用程序,把它放在'Web.confg'中

<httpModules>
  <add name="MyModule" type="MyModule.SyncModule, MyModule" />
</httpModules>

我运行我的 Web 应用程序,并且可以成功调用 COM 组件,但仅限于运行 HttpModule Init 的同一线程。

如果我单击按钮再次运行使用 COM 的线程更改并失败,因为未调用 HttpModule Init()。

如何检测所有新线程以正确调用 Init() 和 CreateActCtx? 可以吗?

【问题讨论】:

    标签: c# asp.net httpmodule side-by-side


    【解决方案1】:

    考虑使用用 [ThreadStatic] 属性装饰的布尔标志,像这样。

    [ThreadStatic]
    static bool _hasInitBeenCalled;
    

    在每个事件中,检查该标志是否为真。如果不是,请运行您的初始化代码,然后将标志设置为 true。本质上,该变量对于每个线程都是唯一的。

    【讨论】:

    • 我尝试将此和 ObjectToEnabledSxS 添加为 HttpModule 类属性。在启动线程 id 5 和 10 初始化和线程 id 2 调用由线程 id 5 初始化的 ObjectToEnabledSxS 的 Dispose()。我正在使用 System.Threading.Thread.CurrentThread.ManagedThreadId 来获取线程 id。也许 HttpModule 死了,GC 调用了 Dispose()?
    • 我的 ObjectToEnableSxS 调用 ActivateActCtx,它返回一个 cookie,该 cookie 唯一地标识了一个特定的、激活的激活上下文。线程 ID 5 和 10 为 cookie 返回相同的值。激活ActCtx msdn.microsoft.com/en-us/library/aa374151(v=vs.85).aspx
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2021-06-19
    相关资源
    最近更新 更多