C# ASP.NET-在代码中动态注册HttpHandler(不在web.config中)

C# ASP.NET-在代码中动态注册HttpHandler(不在web.config中),c#,asp.net,httphandler,web-config,ihttphandler,C#,Asp.net,Httphandler,Web Config,Ihttphandler,可能重复: 是否有一种方法可以在C#code中动态注册IHttpHandler,而不必手动将其添加到web.config中的system.web/httpHandlers部分 这听起来很疯狂,但我有充分的理由这么做。我正在构建一个WidgetLibrary,网站所有者只需将一个.dll文件放入其bin目录即可使用,并且希望通过对web.config的最小配置来支持这一点。我不认为在AppDomain运行后可以修改注册的HttpHandler,因为可用的处理程序直接从web.config文件读取

可能重复:

是否有一种方法可以在C#code中动态注册
IHttpHandler
,而不必手动将其添加到web.config中的
system.web/httpHandlers
部分


这听起来很疯狂,但我有充分的理由这么做。我正在构建一个WidgetLibrary,网站所有者只需将一个.dll文件放入其bin目录即可使用,并且希望通过对web.config的最小配置来支持这一点。

我不认为在AppDomain运行后可以修改注册的HttpHandler,因为可用的处理程序直接从
web.config
文件读取,然后缓存在私有数据结构中

如果预先知道要允许哪些扩展,可以将这些扩展映射到单个
HttpHandlerFactory
,然后返回您选择的处理程序(通过使用动态程序集加载和反射)。例如:

<add path="*.ch1,*.ch2,*.ch3" verb="*" 
    type="MyHandlers.MyHandlerFactory, MyHandlers" />


在运行时修改
web.config
会导致AppDomain重新启动。

创建控件时,我通常会覆盖ControlDesigner类中的GetDesignTimeHtml函数。通过该函数,我检查HttpHandler是否已注册,如果未注册,则注册它。下面是我用来注册新HttpHandler的代码:

    private void RegisterHttpHandler()
    {

        IWebApplication webApplication =
            (IWebApplication)this.GetService(typeof(IWebApplication));

        if (webApplication != null)
        {
            Configuration configuration = webApplication.OpenWebConfiguration(false);
            if (configuration != null)
            {
                HttpHandlersSection section =
                    (HttpHandlersSection)configuration.GetSection(
                    "system.web/httpHandlers");
                if (section == null)
                {
                    section = new HttpHandlersSection();
                    ConfigurationSectionGroup group =
                        configuration.GetSectionGroup("system.web");
                    if (group == null)
                    {
                        configuration.SectionGroups.Add("system.web",
                            new ConfigurationSectionGroup());
                    }
                    group.Sections.Add("httpHandlers", section);
                }
                section.Handlers.Add(Action);
                configuration.Save(ConfigurationSaveMode.Minimal);
            }
        }

    }

Action属性是一个静态HttpHandleration

您不能修改处理程序,但可以按照以下步骤以编程方式向hander添加路由:

  • 如果是WebForms应用程序,请确保您的webapp在web.config中具有UrlRouting配置(yip打破了对web.config进行最小更改的初始要求的一部分),如MS所述:
  • 在处理程序上实现IRoutHandler接口,并在其方法中返回hander作为结果(请参见下面的第一个示例)
  • 注册您的路线(参见下面的第二个示例)
  • 实施IRouteHandler

    public class myHandler : IHttpHandler, IRouteHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }
    
        public void ProcessRequest(HttpContext context)
        {
            // your processing here
        }
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return this;
        }
    }
    
    注册路由:

    //from global.asax.cs
    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new Route
        (
            "myHander.axd",
            new myHandler()
        ));
    }
    

    给你。通过代码注册的投手。:)

    这与StackExchange.MiniProfiler为其UI元素注册其路由和处理程序的方法相同(尽管您仍然需要一个处理程序条目),工作起来很有魅力!非常感谢。我已尝试实现此功能,但处理程序未注册。我是否应该向public void ProcessRequest(HttpContext上下文)添加一些代码?@SSED
    ProcessRequest
    是处理程序的工作方式。你必须在那里添加代码。这个问题是重复的,答案似乎不准确。