小编Gre*_*ech的帖子

在ASP.NET MVC和IIS7中记录原始HTTP请求/响应

我正在编写一个Web服务(使用ASP.NET MVC),出于支持目的,我们希望能够尽可能接近原始的在线格式(即包括HTTP)来记录请求和响应方法,路径,所有标题和正文)到数据库中.

我不确定的是如何以最少的"损坏"方式获取这些数据.通过检查HttpRequest对象的所有属性并从中构建字符串(以及类似的响应),我可以重新构建我认为请求的样子,但我真的想要获取实际的请求/响应数据.发送电线.

我很乐意使用任何拦截机制,如过滤器,模块等,解决方案可以特定于IIS7.但是,我更喜欢将其保留在托管代码中.

有什么建议?

编辑:我注意到HttpRequest有一个SaveAs方法可以将请求保存到磁盘,但是这会使用无法公开访问的内部帮助程序方法从内部状态重建请求(这就是为什么这不允许保存到用户提供的流我不知道).所以它开始看起来我将不得不尽最大努力重建来自对象的请求/响应文本......呻吟.

编辑2:请注意我说的整个请求包括方法,路径,标题等.当前响应只查看不包含此信息的正文流.

编辑3:没有人在这里阅读问题吗?到目前为止,有五个答案,但是没有一个答案暗示了一种获得整个原始线上请求的方法.是的,我知道我可以从请求对象中捕获输出流和标题以及URL和所有内容.我在问题中已经说过了,请看:

通过检查HttpRequest对象的所有属性并从中构建字符串(以及类似的响应),我可以重新构建我认为请求的样子,但我真的想得到实际的请求/响应数据这是通过电线发送的.

如果你知道完整的原始数据(包括header,url,http方法等)根本无法检索,那么知道这将是有用的.同样地,如果你知道如何以原始格式获取所有内容(是的,我仍然意味着包括标题,网址,http方法等),而不必重新构建它,这就是我所问的,那将是非常有用的.但告诉我,我可以从HttpRequest/ HttpResponse对象重建它是没有用的.我知道.我已经说过了.


请注意:在任何人开始说这是一个坏主意,或将限制可扩展性等之前,我们还将在分布式环境中实施限制,顺序传递和反重放机制,因此无论如何都需要数据库日志记录.我不是在寻找关于这是否是一个好主意的讨论,我正在寻找如何做到这一点.

asp.net-mvc logging request ihttpmodule

137
推荐指数
7
解决办法
9万
查看次数

为什么Python使用'魔术方法'?

我最近一直在玩Python,有一件事我发现有点奇怪的是广泛使用'魔术方法',例如使其长度可用,一个对象实现一个方法,def __len__(self)然后它被调用时你写的len(obj).

我只是想知道为什么对象不是简单地定义一个len(self)方法并让它直接作为对象的成员调用,例如obj.len()?我确信Python必须有充分的理由这样做,但作为一个新手,我还没有弄清楚它们到底是什么.

python magic-methods

97
推荐指数
4
解决办法
3万
查看次数

你应该在C#4.0中使用重载或可选参数声明方法吗?

我正在观看Anders关于C#4.0的讨论和C#5.0的预览,它让我想到C#中何时可以提供可选参数什么是推荐的方法来声明不需要指定所有参数的方法?

例如,FileStream类这样的东西有大约十五种不同的构造函数,它们可以分为逻辑"族",例如下面的字符串,来自a的那些IntPtr和来自a的那些SafeFileHandle.

FileStream(string,FileMode);
FileStream(string,FileMode,FileAccess);
FileStream(string,FileMode,FileAccess,FileShare);
FileStream(string,FileMode,FileAccess,FileShare,int);
FileStream(string,FileMode,FileAccess,FileShare,int,bool);
Run Code Online (Sandbox Code Playgroud)

在我看来,这种类型的模式可以通过改为使用三个构造函数来简化,并使用可以默认的参数的可选参数,这将使构造函数的不同系列更加清晰[注意:我知道这个更改不会是在BCL制作,我正在假设这种情况].

你怎么看?从C#4.0开始,将具有可选参数的紧密相关的构造函数和方法组作为单一方法更有意义,还是有充分理由坚持使用传统的多重载荷机制?

c# overloading optional-parameters c#-4.0

91
推荐指数
6
解决办法
2万
查看次数

什么是请求 - 响应对?

例如,在HTTP中,您发送请求并接收响应; 是否有一个描述请求 - 响应对的名词?

我想到了"对话"或"对话",但是这些意味着多个请求 - 响应对,而我正在寻找一个指示一个单词的单词.

问的原因是我需要命名一个封装两者细节的对象,RequestResponse看起来相当蹩脚.

naming http

54
推荐指数
5
解决办法
8073
查看次数

最好的SOAP/REST/RPC Web API示例?你为什么喜欢他们?他们有什么问题?

在我的公司,我们开始分支到Web API来访问和更新我们的数据; 最初是为了合作伙伴,但未来很可能对公众有利.目前API的外观(例如SOAP,REST,RPC)是完全开放的,我们还没有做出任何决定,所以我对人们认为很好的Web API的例子以及你为什么这么认为感兴趣那.

我感兴趣的是使用不同语言的人的意见(我们可能会向使用多种平台的人提供API,特别是包括.NET,Java,ActionScript和JavaScript)关于您认为好的Web API例子,你有很好的经验.

我想谈谈的一些观点:

  1. 您更喜欢SOAP类型服务还是REST/RPC风格服务?我怀疑拥有平台支持的人(例如.NET,Java)会更喜欢SOAP,而使用没有平台支持的语言的人会更喜欢其他人,但我想验证这个假设.

  2. 您是否关心API是否实际上是REST还是它是一个普通的旧式RPC GET/POST?如果是这样,你为什么关心?API是否正确描述自身(即,如果它是RPC样式,并不声称是RESTful)更重要,而不是它实际上是两者之一吗?

  3. 我们需要验证谁在使用该服务.我一直在研究Amazon S3身份验证,它使用公共标识符和私有令牌,用于将请求的参数哈希到验证令牌中(这也类似于flickr).您以前是否使用过这种类型的身份验证,以及如何继续使用它?您是否发现有问题的哈希算法(即您的平台不支持)?您希望在HTTP标头或URI中发送散列吗?

  4. 如何处理版本控制?有一个/v1/类型子目录以便可以同时添加未来的版本,或者你会做一些不同的事情,如请求有效负载或查询中的版本,这是一个好主意吗?您期望支持的API版本需要多长时间(例如,如果引入了v2,那么您在v1的生命周期内的期望是什么).

此外,任何其他意见和要点将有用.

我故意对我们正在实施的API的实际类型保持模糊,因为我正在寻找人们认为好的API和实现机制的一般指导,所以这篇文章及其答案对更多人有用在将来.


注意:我已搜索过,无法找到关于此的一般性问题 - 它们似乎都特定于某种类型的API - 但如果它是重复的,请告诉我.此外,如果它应该是社区维基(我认为人们应该得到答案的信用,所以我没有做到一个)然后请让我知道,我会改变它.

rest rpc soap web-services

48
推荐指数
3
解决办法
2万
查看次数

在.NET 4.0中动态实现接口(C#)

借助.NET 4.0中的新动态功能,似乎应该可以动态实现接口,例如:

public interface IFoo 
{
    string Bar(int baz);
}

public class Foo : IFoo
{
    public string Bar(int baz) { return baz.ToString(); }
}

public class Proxy : IDynamicMetaObjectProvider
{
    private readonly object target;

    public Proxy(object target) { this.target = target; }

    // something clever goes here
}
Run Code Online (Sandbox Code Playgroud)

然后我希望有一些方法可以写:

dynamic proxy = new Proxy(new Foo());
IFoo fooProxy = (IFoo)proxy; // because the target object implements it
string bar = fooProxy.Bar(123); // delegates through to the target implementation
Run Code Online (Sandbox Code Playgroud)

但是,到目前为止,我还不确定要替换什么// …

.net c# dynamic .net-4.0 c#-4.0

46
推荐指数
3
解决办法
3万
查看次数

Microsoft Code Contracts框架有多成熟?

微软最近在DevLabs上发布了他们的Code Contracts框架并获得了商业许可.我们有兴趣在我们的项目中使用它们(主要是C#,一些C++/CLI)来逐步替换所有自定义验证代码,但我很想知道其他人在我们承诺之前使用它的经验,特别:

  • 您是否认为该框架对于大型复杂的商业项目而言已经足够成熟?

  • 使用它时遇到了什么问题?

  • 你从中得到了什么好处?

  • 它目前是否比它的价值更痛苦?

我意识到这是一个有点主观的问题,因为它需要意见,但鉴于这个框架是.NET 4.0的一个非常重要的部分,并且(可能)改变了我们编写验证代码的方式,我希望这个问题将会留下开放以收集有关该主题的经验,以帮助我做出具体的,可回答的问题的决定:

我们下个月应该开始使用吗?

请注意,我们不提供代码API,只提供Web服务,因此对于抛出异常类型方面的大多数代码打破兼容性并不是一个问题.然而,正如我希望更多人而不仅仅是我将受益于这篇文章及其答案,这个领域的任何细节都非常受欢迎.

validation .net-4.0 code-contracts microsoft-contracts

43
推荐指数
3
解决办法
3717
查看次数

究竟什么是"持久性无知"?

持久性无知通常被定义为持久化和检索标准.NET对象的能力(如果您真的坚持给它们命名,则为POCO).一个看似公认的标准.NET对象定义是:

"...普通的课程,你专注于手头的业务问题而不添加与基础设施相关的原因......"

但是,我看到人们将NHibernate描述为一个允许持久性无知的框架,但它是一个不能在任何标准.NET对象上工作的框架,只有符合特定设计要求的标准.NET对象,例如(源代码):

  • 所有类都必须具有默认构造函数
  • 除非打开类并且所有成员都是虚拟的,否则某些功能不起作用
  • 除非您滥用Equals/GetHashCode,否则对象标识无法正常运行

(旁白:在任何人不高兴之前,我并不打算在这里选择NHibernate,它只是一个经常被引用的框架示例,据说允许持久性无知.我敢肯定类似的论点可以应用于其他声称相同的ORM .)

现在虽然这个类本身没有任何持久性特定于框架的属性或基类等,但对我而言,它实际上并不是"持久性无知",因为它必须遵循一套设计指南以便所选持久性框架的使用.您必须考虑到持久性框架的要求来设计和实现该类; 如果你不了解它,那么这个班可能无法使用它.

当我在与"持久性无知" /"POCO"的定义问题是,我不知道怎么样,从概念上讲,这是真的有什么不同,以添加属性,如[Serializable][DataContract][XmlType]或任何其他持久性框架,具体的注解这有利于使用该框架的实体的持久性和检索.

那么,"持久性无知"到底是什么?

很明显,将它定义为能够持久化"普通类"是一种谬误,因为NHibernate只是在没有引用特定于框架的类的情况下是普通的,而它们非常特殊,因为它们需要不寻常的设计选择,例如默认构造函数和所有类-virtual成员和可变类型的Equals/GetHashCode实现.

因此,当对象促进使用持久性框架(在设计和结构中或通过使用特定于框架的注释)但不执行任何持久性逻辑时,"持久性无知"是否合理?

nhibernate orm data-access poco persistence-ignorance

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

析构函数和终结符之间的区别?

请注意:这个问题是关于"析构函数"和"终结器"之间的术语差异及其正确用法.我只提供了在C#和C++/CLI中使用它们的示例,以说明我提出问题的原因.我很清楚它是如何在C#和CLR中实现的,但我问的是术语的正确使用.


在C#世界中,术语"析构函数"和"终结器"似乎几乎可以互换使用,我怀疑是因为C#规范使用"析构函数"一词来描述非确定性清理功能,而CLR文档总是使用单词"终结者",所以在C#领域内他们的意思相同.

但是,在C++/CLI规范中,两者之间存在差异.它允许确定性和非确定性清理,并使用术语"析构函数"作为确定性功能,使用"终结器"作为非确定性功能:

终结器提供非确定性清理.终结器是在垃圾收集期间执行的"最后机会"函数,通常在未执行析构函数的对象上执行.

另外,维基百科对析构函数终结器的描述表明析构函数终结符是单独的概念,并且支持C++/CLI规范使用与确定性有关的术语:

与析构函数不同,终结器不是确定性的.当程序显式释放对象时,将运行析构函数.相反,当内部垃圾收集系统释放对象时,执行终结器.

问题:

  • 从计算机科学的角度来看,是否存在"析构函数"和"终结器"之间明确定义的区别,或者术语是否只能在上下文中定义?

  • 如果存在明确定义的差异,那么为什么C#规范会使用"错误"的术语?

c# destructor terminology finalizer

36
推荐指数
2
解决办法
5395
查看次数

什么是WCF相当于HttpContext.Current.Request.RawUrl?

我在纯WCF上下文中运行了一些RESTful服务(即没有启用ASP.NET兼容性,因此没有HttpContext.Current可用的对象).

服务的URL在请求开始时使用IHttpModule(在此时确实具有HttpContext并使用其重写HttpContext.Current.RewritePath)来重写,以.svc从URL中删除诸如扩展之类的内容.

但是,我需要访问WCF基础结构中请求的原始URL.是否有一个相当于HttpContext.Current.Request.RawUrlOperationContextWebOperationContext类哪儿了吗?使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri返回重写的URL而不是原始的URL.

wcf url-rewriting httpcontext operationcontext weboperationcontext

34
推荐指数
1
解决办法
3万
查看次数