标签: httpmodule

ASP.NET:将内容注入所有Response流

我们在我们的网站上有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)

asp.net httpmodule

5
推荐指数
1
解决办法
630
查看次数

有没有更好的方法从web.config获取正确的模块部分?

我用来获取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取决于我得到的字符串?

c# asp.net iis httpmodule

5
推荐指数
1
解决办法
448
查看次数

将 HttpModule 与 Application_BeginRequest 一起使用,如何仅检查第一个请求?

我正在使用以下 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)

asp.net httpmodule

5
推荐指数
1
解决办法
2655
查看次数

将所有裸域 url 重定向到保留 url 的子域 (www) url,除了 IIS/ASP.NET 上的一页

实现上述目标的最佳方法是什么?我知道它可以在 HttpModule 级别实现。是否可以仅通过 web.config(更容易和更快地执行代码)。

iis httpmodule asp.net-4.0 iis-7.5

5
推荐指数
1
解决办法
3510
查看次数

尝试在IIS6上安装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行,我添加了一个箭头,是红色的.就是这样!没有解释,没有提示去哪里.只是"无法加载类型".我尝试过各种各样的事情来解决这个问题:

  • 如果我弄错了,请使用模块的名称.和类型中的字符串.
  • 将/ Bin更改为/ bin
  • 确保模块是针对.NET Framework 2.0编译的
  • 放弃web.config并尝试将其设置为IIS 6中的映射(从那个获得404).
  • 与之前相关,尝试使我的扩展的所有文件通过带有通配符映射和配置模块的ASP.NET ISAPI模块.带我回到这个错误.

谁能告诉我这里发生了什么?或者,如果失败了,有人能指出我的方向吗?在这一点上,任何方向都可以.:)我完全死路一条.

谢谢!

asp.net iis-6 httpmodule

5
推荐指数
1
解决办法
5699
查看次数

HttpResponse过滤器什么都不返回

我编写了一个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)

c# asp.net filter httpmodule

4
推荐指数
1
解决办法
2001
查看次数

从ASP.NET应用程序调试HTTP模块初始化事件

是否可以从http模块调试init事件?如果我设置了断点,它们就不会被触发.

asp.net httpmodule

4
推荐指数
1
解决办法
2840
查看次数

如何将SQL ELMAH_Error.ErrorID附加到ELMAH错误电子邮件主题?

我正在使用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表中.

Web.Config中:

<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安装).

的Global.asax.cs:

protected void …
Run Code Online (Sandbox Code Playgroud)

c# asp.net elmah event-handling httpmodule

4
推荐指数
1
解决办法
1489
查看次数

RoleProvider不能在服务器上使用自定义IIdentity和IPrincipal

我使用的是定制的IIdentity,并IPrincipal在我ASP.NET MVC通过应用EF 4.3作为expalined 这里(并按照接受的答案的解决方案).另外,我有一个习惯RoleProvider.在本地(使用IIS Express),它的工作原理.但现在,当我在真实主机上传应用程序时,似乎所有用户都在"admin"角色中!例如,我创建了一个不在角色中的用户"admin",但它可以访问所有受保护的页面(需要"admin"角色).例如Role.IsUserInRole总是回来true.你有什么想法吗?你能帮助我吗?我应该做什么设置IIS吗?

iprincipal httpmodule iidentity roleprovider asp.net-mvc-3

4
推荐指数
1
解决办法
2616
查看次数

修改WebApi DelegatingHandler中的Request.Content

我需要修改请求的内容来替换一些字符(因为一些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 asp.net-web-api

4
推荐指数
1
解决办法
3552
查看次数