我在这里可以看到类似的问题,但没有特别相同。
我有一个WCF公共API,客户端可以使用API密钥进行查询。如下所示:
string GetDataForRegion(string apiKey, int regionId);
我需要能够将这些请求与发送回客户端的数据一起记录下来。我可以使用 IDispatchMessageInspector 获取响应,但我看不到我可以获取请求参数的位置。
我可以看到使用 IParameterInspector 可以实现这一点,但是如何将请求和响应结合在一起呢?
理想情况下,我想在日志中(在数据库中)写这样的东西:
DateTime,APIKey,MethhodCalled,参数,响应
Sp,使用上面的示例,它将是:
2012-04-24-15-52-11,myapikey,GetDataForRegion,{regionId:1},[响应数据]
在使用WCF内置的任何内容中是否可以使用它?
谢谢,
ķ
答案 0 :(得分: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