2012-04-24 108 views
0

我可以在这里看到类似的问题,但没有特别的相同。在服务器上记录WCF请求的请求和响应值

我有一个WCF公共API,客户端可以使用API​​密钥进行查询。因此,像:

string GetDataForRegion(string apiKey, int regionId); 

我需要能够与发送回客户端的数据一起记录这些请求。我可以使用IDispatchMessageInspector得到响应,但我看不到请求参数。

我可以看到这是可能的使用IParameterInspector但我怎么把请求和响应结合在一起?

理想情况下,我想写这样的日志(在DB):

日期时间,APIKey,MethhodCalled,参数,响应

SP,使用上面的例子,这将会是:

2012-04-24-15-52-11,myapikey,GetDataForRegion,{regionId:1},[响应数据]

这是可能的内与WCF内置的东西?

感谢,

ķ

+0

你能不能只使用WCF跟踪这一点,还是需要要记录的一些自定义的形式? – 2012-04-24 19:55:06

+0

我看了看跟踪,但输出需要转换成可以方便查看和查询的格式。所以,可能需要写入数据库。解析跟踪日志到数据库是在我的“希望我不必那样做”解决方案列表。 – 2012-04-24 19:57:59

回答

3

IParameterInspector是你想要的。在服务器端,BeforeCall方法在调用用户代码之前调用,并且您可以从此方法返回状态值(通常这将是Guid,但它可以是任何内容)。一旦您的服务运行并生成返回值AfterCall将被调用与匹配BeforeCall相同的状态值。在客户端,它基本上以相同的方式工作,除了在往返服务器之前和之后发生呼叫。

就你而言,分阶段记录信息可能是最容易的。在入站呼叫期间将请求数据插入数据库,并从呼叫中返回一些唯一标识符(标识字段,时间戳等)。在回程中,用响应数据更新匹配记录。例如,这也为您提供了一个快速查看通话时间的方法,以及是否有任何呼叫未能返回。

这里是一个简短的介绍一下这些工作,代码:

http://blogs.msdn.com/b/endpoint/archive/2011/04/28/wcf-extensibility-iparameterinspector.aspx

您还可以使用IDispatchMessageInspector出于同样的目的,它的工作方式基本相同,但你必须撕开Message自己反对;参数检查员可能是一个更好的选择。消息检查员功能更强大,并且似乎更常用,即使是对于“简单”选项也是如此。见:

http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx

+0

看起来是最好的方式。我一直在寻找类似的东西,并填充来自IDispatchMessageInspector的响应,但在获取数据时遇到问题(并且配置会很痛苦)。没有意识到数据在IParameterInspector中可用,因此可以节省大量时间。谢谢! – 2012-04-24 22:29:31