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添加路由:
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
是处理程序的工作方式。你必须在那里添加代码。这个问题是重复的,答案似乎不准确。