Web应用程序初始化如下:
HttpApplication(在代码global.asax隐藏中定义)的实例.Modules集合中(类型HttpModuleCollection)Init()调用它们的方法(当它们注册请求事件时)据我所知,上面的场景发生在Web应用程序启动/初始化时(因此应用程序启动事件).
Modules在Web应用程序处于活动状态时,它们是在每个请求上重新设置还是在每个连续请求中从属性重用?据我了解IIS和Asp.net,它们在Web应用程序的整个生命周期中被重用.
如果它们被重用,我们可以假设它们的Init()方法实际上是应用程序启动事件的伪事件处理程序吗?问题是我们无法附加到http模块中的应用程序级别事件.但是,如果它们被重用,我们可以将其Init()用作应用程序启动事件,并执行我们所做的任何事情global.asax.
我们可以假设模块的Init()方法仅在应用程序启动事件时调用吗?我们可以使用这个假设来注册global.asax我们无法改变其代码隐藏的应用程序的路由吗?web.config通常是可访问的,我们可以按照我们想要的方式进行更改.
这实际上有用吗?
我们可以检查HttpApplication代码并检查其InitModulesCommon()方法.这个实际调用Init()每个注册的HTTP模块.更有趣的是,这种方法仅用于InitIntegratedModules()和InitModules()方法.哪些都只用于HttpApplication.InitInternal()方法.这是我的假设的基础,但我想知道是否有人滥用IHttpModule.Init()应用程序启动事件.
我见过的所有IHttpModule实现如下:
class HttpCompressionModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.SomeEvent += OnSomeEvent;
}
private void OnSomeEvent(Object source, EventArgs e)
{
// ...
}
public void Dispose()
{
// nothing here !!!
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么Dispose方法总是空的?我们不应该取消订阅我们在Init方法中订阅的事件吗?
花了很多时间来筛选关于这个问题的矛盾建议,并认为我会发布我的解决方案.
我的环境是.NET 4.5,Visual Studio 2012,用于MVC 4应用程序.我像过去一样创建了一个Http模块,并将其添加到Web.config中,如下所示:
<configuration>
<system.web>
<httpModules>
<add name="MyModule" type="Services.MyModule, Services" />
</httpModules>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是,应用程序从未调用模块的Init().最后,我发现建议模块应该在内部<system.webServer>,并且命名的元素<modules>代替<httpModules>,如下:
<configuration>
<system.webServer>
<modules>
<add name="MyModule" type="MyModule" type="Services.MyModule, Services" />
</modules>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
重新运行应用程序,它按预期调用Init().FWIW,方向页面在这里:http: //msdn.microsoft.com/en-us/library/ms227673.aspx
HTH
我正在使用HttpModule在我的网站上进行一些URL缩短.我使用的是Visual Studio 2008和IIS 7以及.Net 3.5.
在web.config 的system.webServer元素中指定模块,并且该站点在IIS中运行时,它可以正常工作.配置如下所示:
<system.webServer>
<modules>
<add name="MinimizeModule" type="ClipperHouse.UrlMinimizer.MinimizeModule" />
</modules>...
Run Code Online (Sandbox Code Playgroud)
我的模块附加到BeginRequest事件,一切正常.但是,我无法使用内置的VS Web服务器(Cassini)运行它.我尝试将模块配置移动到web.config中的system.web元素,没有运气.我在它上面放了一个断点,没有任何反应.
有关为什么会出现此问题的任何想法?
(我还尝试了global.asax中的Application_BeginRequest事件.虽然我还是希望保留web.config中的所有内容,但仍然没有运气.)
我正在使用IIS6,我写了一个HttpModule,我得到这个错误?在谷歌搜索网络后,我发现这个问题是由.NET framework 3.5引起的,所以我把它放在我没有安装.NET 3.5的机器上,但问题仍然存在!
我正在使用Visual Studio 2010开发一个针对.NET Framework 4.0的ASP.NET MVC 2网站.
我的web.config包含以下代码:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="XhtmlModule" type="DomenicDenicola.Website.XhtmlModule" />
</modules>
<handlers>
<add name="DotLess" type="dotless.Core.LessCssHttpHandler,dotless.Core" path="*.less" verb="*" />
</handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
当我Build > Publish用来将网站放在我的本地IIS7实例上时,它的效果很好.
但是,当我使用时Debug > Start Debugging,HTTP处理程序和模块都不会在任何请求上执行.
奇怪的是,当我把处理器和模块<add />标签放回<system.web />下<httpHandlers />和<httpModules />,他们的工作.这似乎意味着开发Web服务器以经典模式运行.
我该如何解决?
我正在asp.net MVC3中开发一个应用程序,我有以下问题:我应该何时编写HTTP模块,何时应该编写动作过滤器?
我在面试中被问到如何实施HTTP module和HTTP handler进行的问题ASP.Net MVC.我知道它们在ASP.Net中用于在调用aspx页面之前编写预处理逻辑.但是在ASP.Net MVC中我们有过滤器,所以我告诉他们我们使用过滤器.我给出了正确的答案吗?
IIS支持两种类型的压缩:静态内容压缩和动态内容压缩.根据applicationHost.config,它们由不同的模块处理:DynamicCompressionModule(compdyn.dll)和StaticCompressionModule(compstat.dll),它们被配置为压缩不同类型的请求.另外,我猜测动态压缩不会缓存压缩请求而不是静态压缩(默认情况下,压缩文件会保存到%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files).
然而,除了那些明显的差异,我怀疑还有别的东西.我认为他们以一种稍微不同的方式挂钩到IIS管道.有人会更深入了解一些细节吗?
我发现的方式是我正在使用自定义模块来动态修改CSS文件.当打开静态压缩(并设置为处理默认文件集,即text/css)时,在缓存请求中,我的自定义模块被提供了已经gzip压缩的内容.当我将text/css移动到动态压缩请求列表时,它全部开始工作.但我希望有一个更加坚实的证据,证明它确实是正确的方法.还有其他已知的后果/问题吗?
更新:我想我可能有一个关于它为什么会发生的理论.它可能不是100%正确,但它至少可以解释观察到的行为.我认为静态压缩模块将自己注册到以下事件(在其他事件中):
RQ_MAP_REQUEST_HANDLER
RQ_EXECUTE_REQUEST_HANDLER
Run Code Online (Sandbox Code Playgroud)
然后,当提供对静态文件的请求时,OnMapRequestHandler中的静态压缩模块检查文件之前是否已被压缩以及实际文件是否未被更改.如果是这样,它将重新将请求映射到自身(使用IMapHandlerProvider返回适当的重定向).当它稍后在OnExecuteRequestHandler中实际提供响应时,它会发送压缩文件.另一方面,如果文件之前没有被压缩或者它已经被更改,它不会执行映射重定向并让静态内容模块提供请求,然后在OnPostExecuteRequestHandler中压缩内容(并更新其缓存) .如上所述,我并不是说这正是发生的事情(我不知道源代码),它可能只是一个近似值.此外,动态压缩模块最不可能执行任何此操作.它只是在RQ_EXECUTE_REQUEST_HANDLER之后有时压缩传出的响应.
我有以下模块
public class LowerCaseRequest : IHttpModule {
public void Init(HttpApplication context) {
context.BeginRequest += new EventHandler(this.OnBeginRequest);
}
public void Dispose() { }
public void OnBeginRequest(Object s, EventArgs e) {
HttpApplication app = (HttpApplication)s;
if (app.Context.Request.Url.ToString().ToLower().EndsWith(".aspx")) {
if (app.Context.Request.Url.ToString() != app.Context.Request.Url.ToString().ToLower()) {
HttpResponse response = app.Context.Response;
response.StatusCode = (int)HttpStatusCode.MovedPermanently;
response.Status = "301 Moved Permanently";
response.RedirectLocation = app.Context.Request.Url.ToString().ToLower();
response.SuppressContent = true;
response.End();
}
if (!app.Context.Request.Url.ToString().StartsWith(@"http://zeeprico.com")) {
HttpResponse response = app.Context.Response;
response.StatusCode = (int)HttpStatusCode.MovedPermanently;
response.Status = "301 Moved Permanently";
response.RedirectLocation = app.Context.Request.Url.ToString().ToLower().Replace(@"http://zeeprico.com", @"http://www.zeeprico.com"); …Run Code Online (Sandbox Code Playgroud) httpmodule ×10
asp.net ×5
c# ×3
httphandler ×3
asp.net-mvc ×2
asp.net-2.0 ×1
cassini ×1
events ×1
gzip ×1
iis-6 ×1
iis-7 ×1
web-config ×1