我正在编写一个Web服务(使用ASP.NET MVC),出于支持目的,我们希望能够尽可能接近原始的在线格式(即包括HTTP)来记录请求和响应方法,路径,所有标题和正文)到数据库中.
我不确定的是如何以最少的"损坏"方式获取这些数据.通过检查HttpRequest对象的所有属性并从中构建字符串(以及类似的响应),我可以重新构建我认为请求的样子,但我真的想要获取实际的请求/响应数据.发送电线.
我很乐意使用任何拦截机制,如过滤器,模块等,解决方案可以特定于IIS7.但是,我更喜欢将其保留在托管代码中.
有什么建议?
编辑:我注意到HttpRequest有一个SaveAs方法可以将请求保存到磁盘,但是这会使用无法公开访问的内部帮助程序方法从内部状态重建请求(这就是为什么这不允许保存到用户提供的流我不知道).所以它开始看起来我将不得不尽最大努力重建来自对象的请求/响应文本......呻吟.
编辑2:请注意我说的整个请求包括方法,路径,标题等.当前响应只查看不包含此信息的正文流.
编辑3:没有人在这里阅读问题吗?到目前为止,有五个答案,但是没有一个答案暗示了一种获得整个原始线上请求的方法.是的,我知道我可以从请求对象中捕获输出流和标题以及URL和所有内容.我在问题中已经说过了,请看:
通过检查HttpRequest对象的所有属性并从中构建字符串(以及类似的响应),我可以重新构建我认为请求的样子,但我真的想得到实际的请求/响应数据这是通过电线发送的.
如果你知道完整的原始数据(包括header,url,http方法等)根本无法检索,那么知道这将是有用的.同样地,如果你知道如何以原始格式获取所有内容(是的,我仍然意味着包括标题,网址,http方法等),而不必重新构建它,这就是我所问的,那将是非常有用的.但告诉我,我可以从HttpRequest/ HttpResponse对象重建它是没有用的.我知道.我已经说过了.
请注意:在任何人开始说这是一个坏主意,或将限制可扩展性等之前,我们还将在分布式环境中实施限制,顺序传递和反重放机制,因此无论如何都需要数据库日志记录.我不是在寻找关于这是否是一个好主意的讨论,我正在寻找如何做到这一点.
创建自定义IHttpModules,我意识到静态文件(例如:.css和.js文件)的请求正在访问托管模块.可能图片有同样的问题.IIS是否应该绕过文件系统中存在的文件?
例如:
public class MyModule:IHttpModule
{
public void Dispose(){ }
public void Init(HttpApplication context)
{
context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样声明:
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>
Run Code Online (Sandbox Code Playgroud)
但是,即使使用前提条件,我也可以看到静态文件如何通过模块:
Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js
Run Code Online (Sandbox Code Playgroud)
我试图忽略静态文件的规则,但它没有区别:
routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)
这是通常的吗?或者我在这里遗漏了什么?据我所知,如果静态文件请求应由IIS回答.如果我的托管模块被命中,意味着CLR ThreadPool线程正在处理该请求,对吧?
问候.
更新:
我已禁用"runAllManagedModulesForAllRequests":
<modules runAllManagedModulesForAllRequests="false">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>
Run Code Online (Sandbox Code Playgroud)
一切似乎工作得很好,但我发现这篇文章:http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html建议删除并读取"UrlRoutingModule-4.0 "具有空前置条件的模块.
我的机器,添加该模块在根web.config中,它已经是一个空的preCondition:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>
Run Code Online (Sandbox Code Playgroud)
所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么它默认为"真实"? …
我正在为我的应用程序编写一个web api,目前使用ASP.NET Web Forms编写.我有一个模块,它在请求开始时获取一些数据并将其存储在HttpContext.Current.Items中,以便稍后在页面处理期间可供所有代码使用.
我正在尝试编写我的web api,它需要做同样的事情.在web api控制器处理期间存储"每个请求"全局数据的正确方法是什么(我怀疑它对于常规控制器也是如此).
此外,如果有办法这样做,有没有办法在实例化控制器之前运行的IHttpModule中设置此数据.
任何帮助表示赞赏!
我是否必须锁定对实例成员的访问权限?
例:
public class HttpModule : IHttpModule
{
//...
Dictionary<int, int> foo;
void UseFoo(int a, int b)
{
foo[a] = b;
}
}
Run Code Online (Sandbox Code Playgroud) 我试图通过使用ihttpmodule将js注入页面(到标签).但是没有注入js.
我做了什么:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MyTempProject._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Temp</title>
</head>
<body>
<form id="form1">
<div>
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
public class MyExtensionModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
{
string script …Run Code Online (Sandbox Code Playgroud) 我有一个简单的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.aspx和http://learn.iis.net/page.aspx/243/ASPNET集成与- IIS7 /
我们在生产中使用经典管道.但仍然有兴趣了解其他人的经历.
问题2:在集成模式下使用IIS7会降低性能吗?假设您有几个模块与管道连接,性能影响有多大?如果有人可以指出我做了一些基线研究,那将会很好.
昨晚我写了我的第一个IHttpModule请求处理.我正在使用正则表达式来检查原始URL.该IHttpModule会呼吁每个请求,所以它似乎是合理的做一些正则表达式对象的缓存,以防止对每个请求它的创建.
现在我的问题是...什么是更好的:使用HttpContext.Current.Cache存储实例化的对象或private static Regex在我的模块中使用?
我期待着原因.只是为了澄清:正则表达式永远不会改变,因此永远是同一件事.
这是我们在网站上偶尔看到的奇怪错误。
关于此错误的奇怪的事情是它被抛出在我们的URL重写IHttpModule中。有问题的行是:
var host = context.Request.Url.Host;
Run Code Online (Sandbox Code Playgroud)
如果我记录context.Request.Url何时引发此异常,则它是一个空字符串。
仅通过我们的global.asax文件调用此重写方法:
void Context_AuthorizeRequest(object sender, EventArgs e)
=> URLRewriting.Process();
Run Code Online (Sandbox Code Playgroud)
什么可能导致Request.Url.Host空白?
附带说明,我们在网站上发现了许多其他错误,这些错误表明有人正在使用自动化工具扫描我们的网站,以发现弱点和漏洞。我有种感觉,这可能是有联系的,尽管我不确定为什么Request.Url.Host会一直空着。
第二点,发出最后一个请求的用户IP是大学网络(在我们的网站上并不罕见)。
我被赋予了重写我们的异常处理系统的惊险任务.虽然我会说从应用程序范围来看处理异常并不是我们想要的,但是当我们的团队因为我们需要推出门的大量工作而人手不足时通常是不可避免的,所以请不要燃烧这里异常处理的全球化解决方案:)
我有一个很好的追捕,看看有什么常见的解决方案.目前,我们将Global.asax与Application_Error事件一起使用以执行处于会话状态的Server.GetLastError(),然后将重定向调用到另一个页面,然后检索会话数据并以人类可读的格式输出.重定向还调用一个sproc,它将仔细审核错误信息,a)通过电子邮件发送给开发人员,b)从只能由开发人员查看的网页查看.
我看到做事的新方法是使用IHttpModule接口使用App_Code中的类来做这些事情(这是我的快速实现)
Imports Microsoft.VisualBasic
Public Class ErrorModule : Implements IHttpModule
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
' Not used
End Sub
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.Error, AddressOf context_Error
End Sub
Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim ex As Exception = HttpContext.Current.Server.GetLastError
' do something with the error
' call the stored procedure
' redirect the user to the error page
HttpContext.Current.Server.ClearError()
HttpContext.Current.Response.Redirect("index.htm")
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
我的问题是,这个解决方案比使用Global.asax事件有什么好处?此外,将数据传递到错误页面的最佳方法是什么?
编辑:上面的代码确实工作;)
编辑: …
我需要获取 asp.net MVC 的请求处理时间。我使用 IHttpModule 订阅 onBeginRequest 和 onEndRequest 事件。对于同步控制器,它工作得很好,但对于异步,它返回错误的结果(例如,当实时时间约为 2 分钟时为 20 毫秒)。如何以一般方式获得 AsyncController 的请求处理时间(不在 ActionAsync/ActionCompleted 中为每个异步操作编写附加代码)?
public class TrackRequestModule : RequestProcessingModuleBase, IHttpModule
{
public const string BeginRequestTimeKey = "beginRequestTime";
public void Init(HttpApplication context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.BeginRequest += onBeginRequest;
context.EndRequest += onEndRequest;
}
private void onEndRequest(object sender, EventArgs e)
{
InvokeHandler(sender, OnEndRequest);
}
private void onBeginRequest(object sender, EventArgs e)
{
InvokeHandler(sender, OnBeginRequest);
}
public void OnBeginRequest(HttpContextBase context)
{
context.Items[BeginRequestTimeKey] = DateTime.Now.ToLocalTime(); …Run Code Online (Sandbox Code Playgroud) 我们正在经历突发瞬间的CPU峰值.检查我们的Sitecore日志后,我注意到有很多日志条目"11:49:26正在初始化INFO HttpModule".据我所知,这应该仅在应用程序启动时初始化.这仍然在应用程序启动后出现.我对吗?如果是这样,这些模块可以在哪里第二次初始化?
我想让HttpModule从一些简单的配置数据中注入javascripts,css链接到HEAD元素.我不确定应该挂哪个事件?
我可以使用
- context.PreRequestHandlerExecute动态更改母版页
- Context.BeginRequest用于SEO优化
HTTPModule事件执行命令有一些帮助吗?
谢谢你的提示.干杯,X.
ihttpmodule ×13
asp.net ×8
asp.net-mvc ×4
c# ×4
httpmodule ×3
iis-7 ×2
.net ×1
cassini ×1
cpu-usage ×1
global-asax ×1
hostname ×1
iis ×1
iis-7.5 ×1
logging ×1
performance ×1
request ×1
sitecore ×1
url ×1
vb.net ×1
webforms ×1