标签: httpmodule

是否可以在IIS HttpModule中修改HttpRequest POST的内容?

我需要在IIS中修改某些HttpRequests(SSAS连接字符串)的内容.基本上,我需要向请求中包含的SOAP添加一个元素.

到目前为止,我的方法是向HttpRequest添加一个Filter,并在过滤器的Read方法中执行更改.据我所知,Read永远不会被执行.

我对Request.Filter的理解是它从IIS处理请求时读取,因此IIS应该看到我修改过的Request.

我正在尝试使用HttpModule实际可行的是我的Filter方法是否正确?

如果是这样,什么会导致Read不被击中?

这是我的代码的简化版本:


public class CustomHttpModule : IHttpModule {
    private HttpApplication app;
    public string ModuleName {
        get { return "CustomHttpModule"; }
    }
    public void Init(HttpApplication context) {
        app = context;
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }
    void context_PreRequestHandlerExecute(object sender, EventArgs e) {
        var request = app.Context.Request;
        request.Filter = new CustomHttpFilter(request.Filter);
    }
}

public class CustomHttpFilter : Stream {
    private Stream outputStream;
    public CustomHttpFilter(Stream outputFilter) {
        outputStream = outputFilter;
    }
    public override int Read(byte[] buffer, int offset, int count) …
Run Code Online (Sandbox Code Playgroud)

c# iis ssas httpmodule httprequest

7
推荐指数
1
解决办法
4923
查看次数

如何保护应用程序池免受会话序列化异常的影响?

我们正在为ASP.NET应用程序使用进程外会话提供程序(ScaleOut),我们注意到一个没有正确设置反序列化的对象无意中进入会话时,它最终会导致整个终止的过程.

重现和处理这种情况是它变得更有趣的地方.

AnyStaObjectsInSessionState中引发了终止进程的异常,其实现非常简单:

internal static bool AnyStaObjectsInSessionState(HttpSessionState session)
{
    if (session != null)
    {
        int count = session.Count;
        for (int i = 0; i < count; i++)
        {
            object obj2 = session[i];
            if (((obj2 != null) && (obj2.GetType().FullName == "System.__ComObject"))
                && (UnsafeNativeMethods.AspCompatIsApartmentComponent(obj2) != 0))
            {
                return true;
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪,显示了异常如何终止进程:

An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/1/ROOT

Process ID: 4208

Exception: System.Runtime.Serialization.SerializationException

Message: …
Run Code Online (Sandbox Code Playgroud)

asp.net session serialization restart httpmodule

7
推荐指数
1
解决办法
1944
查看次数

MVC 3/4 HttpModule或ActionFilter

我需要为进入我的应用程序的每个请求检查一些内容(Cookies).

在ASP.NET中我们使用HttpModule来完成这项任务,这个问题应该在MVC中使用什么?一些全局过滤器,或者我也可以使用HttpModuler,在MVC和常规ASP.NET之间的Request PipeLine有什么区别吗?

asp.net asp.net-mvc httpmodule asp.net-mvc-3 asp.net-mvc-4

7
推荐指数
1
解决办法
4690
查看次数

我可以获取OWIN cookie并解密它以在BeginRequest中获取它的声明吗?

我在现有网站中实现新的ASP.NET Identity 2.0 Framework使用CA的Identity Minder,它主要使用Request.ServerVariables为所有控件供电.

我要做的是使用与HTTP处理程序在BeginRequest事件中的每个请求上使用CA执行的相同变量填充请求标头,但使用新的标识提供程序.

我知道在BeginRequest事件中我有权从客户端读取cookie,我知道我可以检查OWIN cookie是否存在(名为.AspNet.ApplicationCookie),但我不知道如何解密cookie到从中得到索赔.

我也试过这样做来阅读声明:

Dim identity = CType(Thread.CurrentPrincipal, ClaimsPrincipal)
Dim claim = identity.Claims.SingleOrDefault(Function(c) c.Type = ClaimTypes.Name)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我得不到任何值,所以我假设在请求管道的早期没有填充Thread.CurrentPrincipal.

但是,此代码确实有效

Dim application As HttpApplication = DirectCast(sender, HttpApplication)
Dim cookie = application.Context.Request.Cookies(".AspNet.ApplicationCookie")
If cookie Is Nothing Then
    HttpContext.Current.Request.Headers.Add("SM_SERVERSESSIONID", "NOT Logged in")
Else
    HttpContext.Current.Request.Headers.Add("SM_SERVERSESSIONID", "Logged in")
End If
Run Code Online (Sandbox Code Playgroud)

因此,考虑到我可以访问cookie,我想知道是否有任何方法可以解密它,以便我可以阅读我在其中设置的声明.

以下是我在登录页面上设置声明的方式:

Dim claims = New List(Of Claim)()
claims.Add(New Claim(ClaimTypes.Name, user.UserName))
claims.Add(New Claim(ClaimTypes.Email, user.Email))
Dim id = New ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie)
authenticationManager.SignIn(id)
Run Code Online (Sandbox Code Playgroud)

asp.net cookies httpmodule owin asp.net-identity

7
推荐指数
1
解决办法
2242
查看次数

在我的网站中添加HttpModule时出现"500内部服务器错误"?

我有一个在godaddy.com注册的网站(在ASP.NET 2.0(C#)中开发)但是当我在我的web.config中添加HttpModule时如下:

<httpModules>
  <add type="WwwSubDomainModule" name="WwwSubDomainModule" />
</httpModules>
Run Code Online (Sandbox Code Playgroud)

但它给了我"500内部服务器错误".当我删除上面的标签,然后我的网站工作正常.谁能猜到为什么它会造成这个问题?

asp.net iis-7 web-applications httpmodule

6
推荐指数
1
解决办法
7806
查看次数

ASP.NET - IHttpModule.BeginRequest触发2X,Application_BeginRequest触发1X

我正在运行VS 2008和.NET 3.5 SP1.

我想在我的ASP.NET应用程序中的HttpModule中实现命中跟踪.我想,很简单.但是,我的HttpModule的BeginRequest事件对每个页面命中都会触发两次.该网站现在非常简单......没有安全性,只需要一些数据库工作.应该每页登录一行.为什么这个事件会发射两次?

此外,IHttpModule.BeginRequest实际上第一次运行时(从关闭的Web浏览器)触发第一页时触发的次数不同... ...当我点击数据库为页面提供动态数据时,3次并且只有1次没有命中数据库的页面.无论我是否触摸数据库,它在第一个页面之后每次点击时会触发2次.

有趣的是,Application_BeginRequest(在Global.asax中)始终只触发一次.

这是代码:

using System;
using System.Data;
using System.Data.Common;
using System.Net;
using System.Web;
using BluHeron.BusinessLayer;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;

namespace BluHeron.HttpModules
{
    public class SiteUsageModule : IHttpModule
    {
        public void Init(HttpApplication httpApp)
        {
            httpApp.BeginRequest += OnBeginRequest;
        }

        static void OnBeginRequest(object sender, EventArgs a)
        {
            UsageLogger.LogSiteUsage(((HttpApplication)sender).Context.Request);
        }

        public void Dispose()
        { }
    }

    public static class UsageLogger
    {
        public static void LogSiteUsage(HttpRequest r)
        {
            string ipAddress = GetHostAddress(Dns.GetHostAddresses(Dns.GetHostName()));
            string browserVersion = r.Browser.Type;

            string[] urlChunks = r.RawUrl.Split('/');
            string …
Run Code Online (Sandbox Code Playgroud)

asp.net httpmodule

6
推荐指数
1
解决办法
4908
查看次数

ASP.NET HttpModule在浏览器中提供"连接重置"

我在ASP.NET中实现了一个HttpModule(框架2.0).

从我在服务器上的日志记录中,我可以看到我的HttpModule正在拾取http请求,并且我的代码成功运行(将内容写回Response流).

但是,Web浏览器(IE,FF,Chrome,都是相同的)只是给我一个"连接重置"错误消息.

我检查了服务器上的事件日志; 那里没有相关的错误或消息.

额外信息:当我在FF中使用"Live HTTP Headers"插件时,它甚至不显示我的客户端请求(虽然我确信它到达服务器,因为在服务器日志中捕获了请求).

我如何解决这里发生的事情?

asp.net httpmodule

6
推荐指数
1
解决办法
9364
查看次数

IIS7 HttpModule和ISAPI Filter执行顺序

我有一个使用ISAPI Rewrite的站点以及一个自定义的HttpModule,它们都进行了Url重定向和重写.

在IIS 6中,一切正常:首先运行ISAPI Rewrite过滤器,然后运行HttpModule.在IIS 7(集成模式)中,顺序现在是相反的,这会产生问题.

我的问题,特别是,HttpModule有一个条件,它会发出一个Url重写使用context.RewritePath.如果没有提供文档,它将显式地向路径添加"index.aspx",因此请求/test/被重写为/test/index.aspx.

在重写路径之后的某个时刻,执行ISAPI重写过滤器.我们有一个与模块相反的规则:/test/index.aspx获取301重定向的请求/test/.因此,我们有一个无限循环.

如何在IIS 7中确定HttpModules和ISAPI过滤器的执行顺序?订单可以更改吗?我发现了这个问题,但它并没有真正帮助.我不是IIS 7的主人,但我确实在某种程度上理解模块和ISAPI过滤器"一起"运行.不幸的是,他们的管理方式不同,我无法弄清楚如何强迫一个人跑到另一个人面前.救命!

注意:我们假设我无法更改现有代码.它在IIS 6中有效.我只想知道是否有办法使其在IIS 7集成模式下工作.

asp.net iis-7 httpmodule isapi

6
推荐指数
1
解决办法
7685
查看次数

创建Asp.net MVC 3应用程序时,我找不到关于UrlRoutingModule的<modules>

我已经下载了MVC 3的源代码,以了解它是如何运行的.

许多人说MVC拦截了UrlRouting Moudle Class的Http请求.

我知道当你定制一个HttpModule时,你需要像这样注册它:

<system.webServer>
    <modules>
      <add name="test" type="WebApplication2.MyModule1,WebApplication2"/>
    </modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

所以Asp.net mvc应用程序的Web.config文件应该有配置部分:

 <add name="UrlRoutingModule"
           type="System.Web.Routing.UrlRoutingModule,..." />
Run Code Online (Sandbox Code Playgroud)

但是当我创建一个新的Asp.net MVC应用程序时,我无法在web.config文件中找到它.

有人说IIS 7会自动添加它.

什么时候到IIS7添加配置部分?

IIS7如何区别它是MVC应用程序还是WebForm?

asp.net-mvc web-config httpmodule

6
推荐指数
1
解决办法
2482
查看次数

自定义HttpModule在IIS7中集成,但不是经典模式

我有一个用asp.net编写的应用程序,我在网站中集成了一些传统的经典asp页面.该站点使用Windows身份验证.因为我无法管理带有角色的.asp页面,所以我编写了一个自定义HttpModule来检查用户是否有权查看这些页面,否则会重定向到"拒绝访问"页面.主要问题是应用程序需要在IIS7上以"经典模式"运行.我的模块在集成模式下工作,但在经典模式下不工作.有没有理由这个代码也不能在经典模式下工作?提前致谢.

这是模块的代码,它非常简单:

public class MyModule: IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.PostAuthenticateRequest += new EventHandler(Application_PostAuthenticateRequest);
    }
    void Application_PostAuthenticateRequest(object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        HttpContext context = ((HttpApplication)source).Context;

        if (context.Request.RawUrl.Contains("/protected-subfolder/"))
        {
            // gets user from windows authentication
            string currentUser = Convert.ToString(context.User.Identity.Name);

            if (!isAdmin(currentUser))
            {
                //deny access
                (context.Response).Redirect(VirtualPathUtility.ToAbsolute("~/AccessDenied.aspx"));
            }
        }
    }

public void Dispose(){ }
Run Code Online (Sandbox Code Playgroud)

这是经典模式的web.config中的设置(不工作):

<configuration>
    <system.web>
        <httpModules>
            <add name="MyModule" type="MyModule" />
        </httpModules>
    </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

并且集成模式(工作)的设置:

<configuration>
    <system.webServer>
        <modules>
            <add name="MyModule" type="MyModule"/>
        </modules>
        <validation validateIntegratedModeConfiguration="false" />
    </system.webServer> …
Run Code Online (Sandbox Code Playgroud)

.net asp.net iis-7 httpmodule

6
推荐指数
1
解决办法
3956
查看次数