我正在编写一个Web服务(使用ASP.NET MVC),出于支持目的,我们希望能够尽可能接近原始的在线格式(即包括HTTP)来记录请求和响应方法,路径,所有标题和正文)到数据库中.
我不确定的是如何以最少的"损坏"方式获取这些数据.通过检查HttpRequest对象的所有属性并从中构建字符串(以及类似的响应),我可以重新构建我认为请求的样子,但我真的想要获取实际的请求/响应数据.发送电线.
我很乐意使用任何拦截机制,如过滤器,模块等,解决方案可以特定于IIS7.但是,我更喜欢将其保留在托管代码中.
有什么建议?
编辑:我注意到HttpRequest有一个SaveAs方法可以将请求保存到磁盘,但是这会使用无法公开访问的内部帮助程序方法从内部状态重建请求(这就是为什么这不允许保存到用户提供的流我不知道).所以它开始看起来我将不得不尽最大努力重建来自对象的请求/响应文本......呻吟.
编辑2:请注意我说的整个请求包括方法,路径,标题等.当前响应只查看不包含此信息的正文流.
编辑3:没有人在这里阅读问题吗?到目前为止,有五个答案,但是没有一个答案暗示了一种获得整个原始线上请求的方法.是的,我知道我可以从请求对象中捕获输出流和标题以及URL和所有内容.我在问题中已经说过了,请看:
通过检查HttpRequest对象的所有属性并从中构建字符串(以及类似的响应),我可以重新构建我认为请求的样子,但我真的想得到实际的请求/响应数据这是通过电线发送的.
如果你知道完整的原始数据(包括header,url,http方法等)根本无法检索,那么知道这将是有用的.同样地,如果你知道如何以原始格式获取所有内容(是的,我仍然意味着包括标题,网址,http方法等),而不必重新构建它,这就是我所问的,那将是非常有用的.但告诉我,我可以从HttpRequest/ HttpResponse对象重建它是没有用的.我知道.我已经说过了.
请注意:在任何人开始说这是一个坏主意,或将限制可扩展性等之前,我们还将在分布式环境中实施限制,顺序传递和反重放机制,因此无论如何都需要数据库日志记录.我不是在寻找关于这是否是一个好主意的讨论,我正在寻找如何做到这一点.
我正在尝试使用像这样的IHttpModule记录http请求的内容:
public class LoggingModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += ContextBeginRequest;
}
private void ContextBeginRequest(object sender, EventArgs e)
{
var request = ((HttpApplication)sender).Request;
string content;
using (var reader = new StreamReader(request.InputStream))
{
content = reader.ReadToEnd();
}
LogRequest(content)
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,在将输入流读取到结尾后,InputStream似乎已消失或更有可能,光标位于流的末尾.
我尝试过request.InputStream.Position = 0;,request.InputStream.Seek(0, SeekOrigin.Begin);但都没有工作.
几个星期以来,我一直在研究ASP.NET Core.我试图在此基础上博客实现的东西: 微服务
我的project.json情况如下:
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.Diagnostics": "1.0.0-rc1-*",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"EntityFramework.Core": "7.0.0-rc1-final",
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",
"Microsoft.AspNet.Mvc.Formatters.Json": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final",
"System.Security.Cryptography.Algorithms": "4.0.0-beta-23516"
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnxcore50": {
"dependencies": {
}
}
},
"exclude": [
"wwwroot",
"node_modules"
],
"publishExclude": [
"**.user",
"**.vspscc"
]
}
Run Code Online (Sandbox Code Playgroud)
而ConfigureServices在方法Startup.cs如下:
public void ConfigureServices(IServiceCollection services)
{
//Registering Authorization Database
AutorizationAccessRegisteration.RegisterComponents(services, …Run Code Online (Sandbox Code Playgroud) .net ×1
asp.net-core ×1
asp.net-mvc ×1
c# ×1
httpmodule ×1
ihttpmodule ×1
inputstream ×1
logging ×1
request ×1