我有一个wcf客户端.根据要求,我需要记录请求中的一些元数据(以及请求中未包含的用户数据.)然后,如果请求成功,我可能必须记录响应元数据并根据标志,完整的肥皂要求.
我正在尝试以正确的方式执行此操作(使用IParameterInspector检查元数据和IClientMessageInspector以获取Soap),但我无法关联两个接口请求.我不确定这里的线程安全性.这是我在哪里的精简版...
public class SoapRequestInfo
{
public string UserId { get; set; }
public Guid Key { get; set; }
//would contain a lot more info
}
public class OperationProfilerParameterInspector : IParameterInspector, IClientMessageInspector
{
//before serialization
public object BeforeCall(string operationName, object[] inputs) //IParameterInspector
{
//Add the operation, record some specific inputs to db
return new SoapRequestInfo
{
UserId = "1234",
Key = new Guid()
};
}
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) //IParameterInspector
{
var info = correlationState as SoapRequestInfo;
//Do some additional logging - easy enough
}
public object BeforeSendRequest(ref Message request, IClientChannel channel) //IClientMessageInspector
{
//want to correlate this with IParameterInspector
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState) //IClientMessageInspector
{
//May want to log full soap message depending on after call criteria
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我不能使用私有变量来保存Guid.我不能使用会话,因为可能有多个请求紧密连续,并不能保证响应是正确的.那么如何才能唯一地识别两个接口之间的correlationState?
evg*_*nyl -1
也许你可以尝试做一些不同的事情:
从这篇文章中将相关令牌传递给 WCF 服务?:
如果您将消息版本与 WS-Addressing 一起使用,您应该会自动拥有它,因为每条消息都将包含其自动生成的 ID (guid),并且每个响应也将包含请求的 ID。您可以通过OperationContext访问这些标头
如果使用消息不符合您的要求,您可能可以尝试在发送请求时将自己的 id 放入标头中,并可能使用相同的 id 更新响应。