0

asp.netでautofacを使用しています。Global.asax で、すべての Web ページを登録します。

AssertNotBuilt();
// Register Web Pages
m_builder.RegisterAssemblyTypes(typeof(AboutPage).Assembly)
  .Where(t => t.GetInterfaces().Contains(typeof(IHttpHandler)))
  .AsSelf().InstancePerLifetimeScope();

m_container = m_builder.Build();
m_wasBuilt = true;

次に、カスタム httpHandler を使用して現在の Web ページを取得します。

    public class ContextInitializerHttpHandler : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            //Get the name of the page requested
            string aspxPage = context.Request.Url.AbsolutePath;

            if (aspxPage.Contains(".aspx"))
            {
                // Get compiled type by path
                Type webPageBaseType = BuildManager.GetCompiledType(aspxPage).BaseType;

                // Resolve the current page
                Page page = (Page)scope.Resolve(webPageBaseType);

                //process request
                page.ProcessRequest(context);

            }
        }
        public bool IsReusable
        {
        get { return true; } 
        }
  }

すべて正常に動作しますが、Web page_load に入ると、ページに存在するすべての asp コントロールが null であることがわかります。それらが null である理由と、それらを初期化するにはどうすればよいですか?

4

1 に答える 1

0

私はそれを考え出した。登録したページは、http ハンドラーのコンテキストから取得できるページのようにコンパイルされません。

string aspxPage = context.Request.Url.AbsolutePath;
Type webPageBaseType = BuildManager.GetCompiledType(aspxPage);

これらは、すべてのコントロールを保持するために必要なページです。問題は、それらが動的で somewebpage_aspx の形式で表示され、アセンブリが App_Web_somewebpage.aspx.cdcab7d2.r3x-vs2n、Version=0.0.0.0、Culture=neutral、PublicKeyToken であるため、http ハンドラーに登録できないことです。 =ヌル。

したがって、解決策 (またはハック..) は、Web ページを登録せず、代わりにスコープからページ コントロールを解決することでした。

ILifetimeScope scope = IocInitializer.Instance.InitializeCallLifetimeScope();
Type webPageType = BuildManager.GetCompiledType(aspxPage);
Page page = (Page)Activator.CreateInstance(webPageType);

foreach (var webPageProperty in webPageType.GetProperties(BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.Public))
{
    if (scope.IsRegistered(webPageProperty.PropertyType))
    {
        var service = scope.Resolve(webPageProperty.PropertyType);
        webPageProperty.SetValue(page, service, null);
    }
}
于 2012-10-24T07:07:27.610 に答える