我们在我们的网站上有ASPX和HTML文件的大趋势,并希望在每个文件的末尾注入一个小的JavaScript.如果我想使用和HttpModule(尝试学习新东西)这样做,这会有 - 有任何明显的问题吗?
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
var context = HttpContext.Current;
if (!isAspxOrHtmlFile(context.Request.Path)
{
return;
}
var javascript = ...
using (var writer = new StringWriter())
{
context.Server.Execute(context.Request.Path, writer);
context.Response.ContentType = "text/html";
context.Response.Write(writer.GetStringBuilder().ToString() + javascript);
}
context.Response.End();
}
Run Code Online (Sandbox Code Playgroud) 我用来获取HTTP模块的代码基本上就是这样
HttpModulesSection modules = ((SystemWebSectionGroup)config.GetSectionGroup("system.web")).HttpModules;
// Depending on what we need to do...
//modules.Modules.Add(CreateSomeModule());
//modules.Modules.Remove("SomeOtherModule");
Run Code Online (Sandbox Code Playgroud)
在IIS7之前,这工作正常.迁移命令%SystemRoot%\system32\inetsrv\appcmd migrate config "website/"将模块移动到system.webServer,因此我的代码现在正在更新错误的部分.
是否有内置方法来获取应修改的正确模块部分?或者我是否必须添加对Request.ServerVariables ["SERVER_SOFTWARE"]的检查并返回system.web/ system.webServer取决于我得到的字符串?
我正在使用以下 HttpModule 来阻止几个不断尝试向我的联系表单发送垃圾邮件的 IP。我没有收到垃圾邮件,因为它们触发了 System.Web.HttpRequestValidationException,但我确实在电子邮件收件箱中收到了异常报告。虽然没那么烦人,但也差不多了。
我最终想要针对数据库中的 IP 列表进行测试,或者可能实现 HttpBL api 来针对已知的黑名单 IP 进行测试,但对每个请求执行此操作似乎有些过分了。不管怎样,无论是使用数据库中的 IP 还是在每个页面请求时向外部黑名单发出请求,似乎都是不必要的。你能给我指出检查一次的方向吗?如果IP第一次通过测试就停止检查?
using System;
using System.Web;
namespace DomainModel.Services
{
public class BlockIPModule : IHttpModule
{
public void Dispose() {}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(Application_BeginRequest);
}
private void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
string currentIP = context.Request.UserHostAddress;
if (!IsIpValid(currentIP))
{
context.Response.StatusCode = 403;
}
}
private bool IsIpValid(string checkIP)
{
return (checkIP != "213.5.70.205" && checkIP != "188.92.75.82");
}
} …Run Code Online (Sandbox Code Playgroud) 实现上述目标的最佳方法是什么?我知道它可以在 HttpModule 级别实现。是否可以仅通过 web.config(更容易和更快地执行代码)。
两个小时的搜索谷歌和Stackoverflow,我无处可去.这与代码隐藏无关,这就是我到目前为止没有运气的原因.
这是我的问题:我有一个运行IIS6的遗留网站,我需要在其上安装HTTPModule,以便为特定文件类型的任何请求添加一些处理.我编写了模块,将其复制到应用程序的/ bin目录,并将以下内容添加到我的Web.config中:
<system.web>
<httpModules>
<add name="YourModule" type="SecurityModule.SecurityModule" />
</httpModules>
</system.web>
Run Code Online (Sandbox Code Playgroud)
然后我启动网站并且......"/ MyApplication中的服务器错误".
以下是它给我的全部内容:
配置错误
描述:处理为此请求提供服务所需的配置文件时发生错误.请查看下面的具体错误详细信息并相应地修改配置文件.
分析器错误消息:无法加载类型'SecurityModule.SecurityModule'.(D:\ Websites\Reports\web.config第4行)
来源错误:
Line 2: <system.web>
Line 3: <httpModules>
-->Line 4: <add name="YourModule" type="SecurityModule.SecurityModule" />
Line 5: </httpModules>
Line 6: </system.web>
Run Code Online (Sandbox Code Playgroud)
源文件:D:\ Websites\Reports\web.config行:4
版本信息:Microsoft .NET Framework版本:2.0.50727.3625; ASP.NET版本:2.0.50727.3618
第4行,我添加了一个箭头,是红色的.就是这样!没有解释,没有提示去哪里.只是"无法加载类型".我尝试过各种各样的事情来解决这个问题:
谁能告诉我这里发生了什么?或者,如果失败了,有人能指出我的方向吗?在这一点上,任何方向都可以.:)我完全死路一条.
谢谢!
我编写了一个HttpModule,用于拦截调用WebResource.axd处理程序,以便我可以对javascript执行一些后期处理.
该模块包装Response.Filter流以执行其处理并将其更改写入基础流.
我遇到的问题是脚本没有返回到浏览器.
因此,作为一个非常简单的例子,它只是作为一个传递,模块看起来像这样:
public class ResourceModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);
}
void context_PostRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
if (context.Request.Url.ToString().Contains("WebResource.axd"))
{
context.Response.Filter = new ResourceFilter(context.Response.Filter);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且只输出它收到的资源的ResourceFilter如下所示:
public class ResourceFilter : MemoryStream
{
private Stream inner;
public ResourceFilter(Stream inner)
{
this.inner = inner;
}
public override void Write(byte[] buffer, int offset, int count)
{
inner.Write(buffer, offset, count);
}
} …Run Code Online (Sandbox Code Playgroud) 是否可以从http模块调试init事件?如果我设置了断点,它们就不会被触发.
我正在使用ELMAH将错误记录到SQL数据库并发送电子邮件.我想将ELMAH_Error.ErrorId附加到ELMAH电子邮件的主题中.
我正在将ElmahLog_Logged事件中的ErrorId ELMAH保存到会话变量中,正如我在此问题中发现的那样.Atif Aziz自己在这篇博文中评论了以下关于此的信息:
如果在邮件发送期间确实想要在记录的错误处获得破解,则必须在ErrorLogModule.Logged事件中将其拾取.这可能很方便,例如,将记录的错误的Id推送到邮件中.为此,您将Id从Logged事件中隐藏到HttpContext中,稍后在Mailing事件中使用它.为此,模块将被注册,以便在Logged事件之后发生Mailing事件.
我认为,因为httpModules首先添加了ErrorLog而第二个是ErrorMail,所以这将实现在Logged事件之后注册Mailing事件.我想这是在谈论事件的顺序,而不是模块应用的顺序.
你如何注册HttpModules的事件顺序?
我试过下面的代码无济于事.下面的代码阻止电子邮件发送,但错误仍记录到SQL表中.
<system.web>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
</httpModules>
<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
</system.web>
Run Code Online (Sandbox Code Playgroud)
......而且......
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
</modules>
<handlers>
<add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
</handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
当然,并且配置正确(我通过NuGet安装).
protected void …Run Code Online (Sandbox Code Playgroud) 我使用的是定制的IIdentity,并IPrincipal在我ASP.NET MVC通过应用EF 4.3作为expalined 这里(并按照接受的答案的解决方案).另外,我有一个习惯RoleProvider.在本地(使用IIS Express),它的工作原理.但现在,当我在真实主机上传应用程序时,似乎所有用户都在"admin"角色中!例如,我创建了一个不在角色中的用户"admin",但它可以访问所有受保护的页面(需要"admin"角色).例如Role.IsUserInRole总是回来true.你有什么想法吗?你能帮助我吗?我应该做什么设置IIS吗?
我需要修改请求的内容来替换一些字符(因为一些unicode问题).以前(在ASP.NET MVC中)我用HttpModules做了这个,但是在WebApi中我似乎应该使用DelegatingHandler,但它完全不同.
现在我想知道如何request.Content在SendAsync方法中进行修改.我需要这样的东西:
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
var s = await request.Content.ReadAsStringAsync();
// do some modification on "s"
s= s.replace("x","y");
request.Content = new StringContent(s);
var response = await base.SendAsync(request, cancellationToken);
return response;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我想我应该检查请求的内容类型,然后决定做什么.如果是,我应该做哪些检查?
httpmodule ×10
asp.net ×7
c# ×3
iis ×2
asp.net-4.0 ×1
elmah ×1
filter ×1
iidentity ×1
iis-6 ×1
iis-7.5 ×1
iprincipal ×1
roleprovider ×1