我正在编写一个 Web 服务(使用 ASP.NET MVC) ,出于支持的目的,我们希望能够将请求和响应尽可能接近原始的线上格式(即包括 HTTP 方法、路径、所有头和主体)记录到数据库中。
我不确定的是如何以最少“损坏”的方式获得这些数据。我可以通过检查 HttpRequest
对象的所有属性并根据它们构建一个字符串(对于响应也是类似的)来重新构建我认为的请求,但是我真的希望获得通过网络发送的实际请求/响应数据。
我很乐意使用任何拦截机制,比如过滤器、模块等,并且解决方案可以特定于 IIS7。但是,我更喜欢仅将它保存在托管代码中。
有什么建议吗?
编辑: 我注意到 HttpRequest
有一个 SaveAs
方法,它可以将请求保存到磁盘上,但是这个方法使用不能公开访问的大量内部助手方法从内部状态重建请求(这就是为什么不允许保存到用户提供的流我不知道)。因此,看起来我不得不尽最大努力从对象中重建请求/响应文本..。
编辑2: 请注意,我说的是 完整请求,包括方法、路径、头文件等。目前的反应只看身体流,其中不包括这一信息。
编辑3: 这里没有人读问题吗?到目前为止已经有五个答案了,但是没有一个答案能够提示我们如何得到这个原始的在线请求。是的,我知道我可以从请求对象捕获输出流、标题、 URL 和所有这些东西。我在问题里已经说过了,看:
我可以通过检查 HttpRequest 对象的所有属性并从中构建一个字符串(对于响应也是如此)来重新构建我认为的请求,但是我真的很想获得通过网络发送的实际请求/响应数据。
如果您知道 完整原始数据(包括头、 url、 http 方法等)根本无法检索,那么了解这一点将非常有用。类似地,如果你知道如何获取原始格式的文件(是的,我仍然是指包含头文件、 url、 http 方法等)而不必重新构造它,这就是我要求的,那么这将是非常有用的。但是告诉我可以从 HttpRequest
/HttpResponse
对象重建它是没有用的。我知道。我已经说过了。
请注意: 在任何人开始说这是一个坏主意,或将限制可伸缩性等之前,我们还将在分布式环境中实现节流、顺序传递和反重播机制,因此无论如何都需要数据库日志记录。我不是在讨论这是否是一个好主意,我在寻找如何实现它。