标签: httpmodule

使用HttpModule进行异常处理

我们正在审查该公司系统的异常处理之一,并发现了一些有趣的事情.

大多数代码块(如果不是全部)都在try/catch块中,并且在catch块内部抛出新的BaseApplicationException - 这似乎来自企业库.我在这里遇到了一些麻烦,因为我没有看到这样做的好处.(在任何时候发生另一个例外)其中一个开发人员一直在使用该系统说这是因为该类负责发布异常(发送电子邮件和类似的东西),但他不太确定.在花了一些时间浏览代码之后,我非常有信心地说,这就是收集有关环境的信息而不是发布它.

我的问题是: - 将所有代码包装在try {} catch {}块中并且抛出新的异常是否合理?如果是,为什么?有什么好处?

我的个人意见是,使用HttpModule会更容易,注册Application事件的Error事件,并在模块内部执行必要的操作.如果我们走这条路,我们会错过什么吗?有什么缺点吗?

您的意见非常感谢.

c# asp.net exception-handling httpmodule

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

JS,图像和CSS被HTTPModule拦截

我有一个简单的HTTPModule,它可以进行一些自定义会话状态管理.

public void Init(HttpApplication context)
        {
            context.AcquireRequestState += new EventHandler(ProcessBeginRequest);
            ActivityLogger.LogInfo( DateTime.UtcNow.ToLongTimeString() + " In Init " + HttpContext.Current.Request.Url.AbsoluteUri);
        }
Run Code Online (Sandbox Code Playgroud)

public void ProcessBeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            ActivityLogger.LogInfo(DateTime.UtcNow.ToLongTimeString() + " In ProcessBeginRequest ");
            if (application != null)
            {
                string requestURL = application.Context.Request.Url.ToString();
                ActivityLogger.LogInfo(DateTime.UtcNow.ToLongTimeString() + " In ProcessBeginRequest " + requestURL);
            }
            return;
        }
Run Code Online (Sandbox Code Playgroud)

当我使用断点运行此代码时,我看到即使对于静态文件(如images,js和css)也调用了此模块.有没有人经历过这个?我认为HTTP模块只是挂钩到asp.net页面的http管道中的事件.他们是否也依赖于静态资源?或者只是卡西尼?

环境:VS2008 - cassini服务器

PS:我在沙箱中尝试使用Win2k8 IIS7(有点新),并尝试将其写入日志文件(因为我们没有VS),但无法写入日志文件.我确定它的一些写权限问题.任何人都可以指向我一些资源,它告诉我如何在W2k8中运行带有IIS7的ASP.net时为目录设置写权限

Edit1:我知道使用Integrated管道可以扩展静态和托管资源的http管道 http://aspnet.4guysfromrolla.com/articles/122408-1.aspxhttp://learn.iis.net/page.aspx/243/ASPNET集成与- IIS7 /

我们在生产中使用经典管道.但仍然有兴趣了解其他人的经历.

问题2:在集成模式下使用IIS7会降低性能吗?假设您有几个模块与管道连接,性能影响有多大?如果有人可以指出我做了一些基线研究,那将会很好.

asp.net iis-7 cassini httpmodule ihttpmodule

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

为什么Thread.CurrentThread.CurrentCulture在Page Rendering和HttpModule.PostRequestHandlerExecute之间发生变化?

我正在创建一个HttpModule,它需要知道在MVC应用程序中设置的Thread.CurrentThread.CurrentCulture的值.该值当前由BaseController设置,但是当我的HttpModule.PostRequestHandlerExecute()方法触发时,它将恢复到文化在页面呈现之前的状态.

我通过使用以下步骤创建一个简单的Web应用程序来重复此操作:

  1. Module.PreRequestHandlerExecute:将文化设置为A.
  2. Page_Load:文化目前A.将文化设置为B.
  3. Module.PostRequestHandlerExecute:当前的线程文化是A.我希望它是B但它在页面呈现和PostRequestHandlerExecute之间被更改了

知道为什么.Net会改变这个值或者我怎么能绕过它?线程是一样的,所以.Net中的某些内容必须明确地恢复文化.

c# asp.net-mvc httpmodule

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

IIS7中的自定义基本身份验证失败

我有一个ASP.NET MVC应用程序,有一些RESTful服务,我试图使用自定义基本身份验证来保护它们(它们是根据我自己的数据库进行身份验证).我已经通过编写HTTPModule实现了这一点.

我有一个方法附加到HttpApplication.AuthenticateRequest事件,它在身份验证失败的情况下调用此方法:

    private static void RejectWith401(HttpApplication app)
    {
        app.Response.StatusCode = 401;
        app.Response.StatusDescription = "Access Denied";
        app.CompleteRequest();
    }
Run Code Online (Sandbox Code Playgroud)

此方法附加到HttpApplication.EndRequest事件:

    public void OnEndRequest(object source, EventArgs eventArgs)
    {
        var app = (HttpApplication) source;
        if (app.Response.StatusCode == 401)
        {
            string val = String.Format("Basic Realm=\"{0}\"", "MyCustomBasicAuthentication");
            app.Response.AppendHeader("WWW-Authenticate", val);
        }
    }
Run Code Online (Sandbox Code Playgroud)

此代码添加"WWW-Authenticate"标头,告诉浏览器抛出登录对话框.当我使用Visual Studio的Web服务器进行本地调试时,这非常有效.但是当我在IIS7中运行它时失败了.

对于IIS7,除了匿名之外,我都关闭了内置的身份验证模块.它仍然返回HTTP 401响应,但它似乎正在删除WWW-Authenticate标头.

有任何想法吗?

authentication asp.net-mvc iis-7 httpmodule custom-authentication

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

我怎么能在任何我想要的响应流中插入一个字符串?

可能有一种简单的方法可以做到这一点,但我看不到它......

我创建了一个简单的Http模块,它在PreRequestHandler上启动一个计时器,并停止PostRequestHandler上的计时器来计算页面加载所花费的时间.

然后我创建一些简单的html并将我的结果写入Response.Write.因为我在PostRequestHandler中执行此操作,所以它会在</html>标记之后添加我的结果.这对测试很好,但我需要在页面需要验证的情况下.

我似乎无法弄清楚如何操作Response对象以在</body>标记之前插入我的结果.Response.Write和Response.Output.Write没有这种灵活性,我无法看到使用Response作为字符串的方法.我错过了一些容易的事吗?

asp.net string asp.net-mvc response.write httpmodule

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

帮助从HttpContext.InputStream中读取JSON

我创建了一个HttpModule来捕获审计请求.

对于Web方法的Ajax请求,我还想记录与请求关联的JSON数据.

例如请求

POST /MyPage.aspx/AddRecord HTTP/1.1
x-requested-with:XMLHttpRequest
Accept-Language:en-gb
Referer:http:// fiddlerlocal:5000/AddRecord.aspx
Accept:application/json,text/javascript,/
Content-类型:application/json; charset = utf-8
UA-CPU:x86
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(兼容; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
主机:fiddlerlocal:5000
内容长度:287
连接:Keep-Alive
Pragma:no-cache
Cookie:.....
{"id" : "282aa3b5-b55f-431C-916e-60433fdb61c0", "日期":"

我已经尝试了各种方法从HttpContext.InputStream中读取JSON({"id":"282aa3b5-b55f-431c-916e-60433fdb61c0","date":"8-6-2010"}).

例1:

StreamReader reader = new StreamReader(request.InputStream);
string encodedString = reader.ReadToEnd(); - ReadToEnd返回一个空字符串

例2:

using(MemoryStream ms = new MemoryStream())
{
byte [] buffer = new byte [request.ContentLength];
request.InputStream.Read(buffer,0,request.ContentLength);
ms.Write(buffer,0,request.ContentLength); - 字节数组包含正确的字节数但每个字节的值为0 …

asp.net json inputstream xmlhttprequest httpmodule

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

Asp.net全局输出缓存

最近几天我想到了asp.net中的输出缓存.在我的任务中,我需要为这个非常大的项目实现输出缓存.经过几个小时的搜索,我没有找到任何例子.

最流行的使用输出缓存的方式是声明性的,在这种情况下,您需要在要缓存的页面上编写类似这样的内容.

但是,如果您需要缓存整个站点,则必须在项目的所有页面或母版页上编写此文件.这很疯狂.在这种情况下,您无法将所有配置存储在一个位置.所有页面都有自己的配置..

Global.asax可以帮助我,但我的网站包含大约20个web progects和~20个global.asax文件.而且我不想为每个项目复制相同的代码.

出于这些原因,我决定创建HTTPModule.在Init方法中,我订阅了两个事件:

public void Init(HttpApplication app)
{
  app.PreRequestHandlerExecute += new EventHandler(OnApplicationPreRequestHandlerExecute);
  app.PostRequestHandlerExecute += new EventHandler(OnPostRequestHandlerExecute);
}
Run Code Online (Sandbox Code Playgroud)

在方法"OnPostRequestHandlerExecute"中,我为每个新请求设置输出缓存参数:

public void OnPostRequestHandlerExecute(object sender, EventArgs e)
{
  HttpApplication app = (HttpApplication)sender; 
  HttpCachePolicy policy = app.Response.Cache;
  policy.SetCacheability(HttpCacheability.Server);
  policy.SetExpires(app.Context.Timestamp.AddSeconds((double)600));
  policy.SetMaxAge(new TimeSpan(0, 0, 600));
  policy.SetValidUntilExpires(true);
  policy.SetLastModified(app.Context.Timestamp);
  policy.VaryByParams.IgnoreParams = true; 
}
Run Code Online (Sandbox Code Playgroud)

在"OnApplicationPreRequestHandlerExecute"方法中,我将calback方法设置为缓存验证:

public void OnApplicationPreRequestHandlerExecute(object sender, EventArgs e)
{
  HttpApplication app = (HttpApplication)sender;
  app.Context.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(Validate), app);
}
Run Code Online (Sandbox Code Playgroud)

最后一部分 - 回调验证方法:

public void Validate(HttpContext context, Object data, ref HttpValidationStatus status)
{
  if (context.Request.QueryString["id"] == …
Run Code Online (Sandbox Code Playgroud)

asp.net caching outputcache httpmodule

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

ASP.NET Web API StreamContent与IIS静态文件处理程序

我把一起使用的ASP.NET Web API文档管理服务,以及性能的一些担忧.

基于IIS/ASP.NET ImageResizer模块的作者Nathanael Jones撰写的这篇文章,我对服务静态文件的"最佳"性能所需的内容有了一些先入之见.正是这样:

  1. 使用a,HttpModule因为它在ASP.NET管道的早期(较少的管道=更优化),并且结果更容易处理这类事情而不是HttpHandler.
  2. Response.WriteFile(filename)Response.Write(memBuffer)memBuffer是内存中的C#缓冲区更好.
  3. URL重写(即Context.RewritePath(virtualPath))更好Response.WriteFile(filename),因为它将使用IIS静态文件处理程序,这是经过优化的.

麻烦的是,由于一些奇怪的缓存问题,我仍然无法达到(这里)的底部,我的URL重写技术本身并不表现.

所以现在我想知道更多以Web API为中心的实现,如下所示:

public Task<HttpResponseMessage> DoTheFoo()
{
    return Task<HttpResponseMessage>.Factory.StartNew(() =>
    {
        var response = new HttpResponseMessage();
        response.Headers.Add("Content-Disposition", "inline; filename=\"" + attachmentFileName + "\"");
        response.Headers.Add("content-type", mimeType);
        response.Content = new StreamContent(File.OpenRead("somefile.doc"));

        return response;
    });
}
Run Code Online (Sandbox Code Playgroud)

对于Web API解决方案,这显然会使事情变得更加简洁,因为服务的文件服务部分可以与控制器中的其他操作一起使用,但它的执行和扩展程度如何?我思考的因素:

  1. 网络带宽.据推测,这里没有区别,所有技术都写入相同数量的字节.
  2. 写入传出网络流的速度.IIS静态文件处理程序在这方面可能比ASP.NET管道好一点?也许整合管道问题少了?该服务将用于消费级别的几百kbits DSL线路之间的任何服务,最高可达gbit LAN.
  3. RAM使用情况.我假设StreamContent实现不如IIS静态文件处理程序那么高效.
  4. CPU使用率.与RAM一样,我假设StreamContent比IIS静态文件处理程序要求更高.
  5. 服务器端缓存.IIS静态文件处理程序提供了这个(并且正是让我烦恼的原因,因为它似乎并不表现自己),但假设我可以让它自己行动,这将在StreamContent实现之前提供好处.我不是很担心这方面,因为服务更有可能响应很多不同的文件请求,而不是相同的重复.

我无法组建一个服务器场来测试它以获得真实的性能数据,而且我怀疑将小规模测试结果分解会给出任何准确的结果.那些知情人士,我可以期待什么样的差异?我几乎已经准备好放弃URL重写实现,但如果它会给我一个明显的性能影响,我会坚持下去.

iis performance httpmodule asp.net-web-api

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

将错误从HttpModule传递到MVC应用程序

我有一个自定义HttpModule用于身份验证.在模块的AuthenticateRequest事件处理程序中,我检查自定义SSO票证是否可用,并在这种情况下执行一些身份验证逻辑.

如果SSO票证可用但不正确,我想向用户显示友好的错误消息.我希望能够以某种方式设置HTTP状态401(未授权,在身份验证失败时使用)并从http模块传递有意义的错误消息.

然后,我希望MVC应用程序以某种方式获取此信息,并使用它来呈现自定义401错误页面,其中包含来自模块的有意义的错误消息.

什么是在http模块中引发错误的最佳方法,以及使用MVC应用程序显示错误的最佳方法是什么(在MVC应用程序的布局中获取错误消息)?

asp.net httpmodule asp.net-mvc-4

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

IIS8为什么可能无法加载HttpModule?

我有一个HttpModule,它已在许多站点中成功实现.我试图在IIS 8下的Windows 8 PC上实现它并且它没有被加载.配置如下:

  • 应用程序池正在运行带有.Net 4.0的集成模式
  • 该DLL已使用.Net 4.0编译
  • dll已在web.config的system.webServer部分中正确注册(这不是使用旧的system.web配置部分和经典模式的问题).
  • 模块在模块下的IIS管理器中正确显示,实际上是使用用户界面注册的.
  • Web应用程序还加载了IsapiModule - (SQL Server Analysis Services msmdpump),这是正常的.

作为参考,web.config部分如下.

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
      <add name="MyModule" type="MyModule.ClassName" />
   </modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

我想知道,IIS8中是否有任何新的全局选项可以默认禁用托管的HttpModule?

httpmodule iis-8

5
推荐指数
0
解决办法
1188
查看次数