在WCF发送消息之前,在哪里可以找到MSMQ查找ID?
我们有一个托管在IIS中的WCF服务,该服务具有netMsmqBinding。在将消息发送到我们的服务之前,我们希望记录。我在哪里可以找到这些信息 我们在IErrorHandler中得到它,因为MsmqPoisonMessageException有一个属性。我们需要在请求开始时记录它,以便将异常与消息关联起来在WCF发送消息之前,在哪里可以找到MSMQ查找ID?,wcf,msmq,netmsmqbinding,Wcf,Msmq,Netmsmqbinding,我们有一个托管在IIS中的WCF服务,该服务具有netMsmqBinding。在将消息发送到我们的服务之前,我们希望记录。我在哪里可以找到这些信息 我们在IErrorHandler中得到它,因为MsmqPoisonMessageException有一个属性。我们需要在请求开始时记录它,以便将异常与消息关联起来 我原以为IDispatchMessageInspector是合适的位置,但我似乎在方法中找不到任何可以提供查找ID的属性。到目前为止,我找到的唯一解决方案是对AfterReceiveReq
我原以为IDispatchMessageInspector是合适的位置,但我似乎在方法中找不到任何可以提供查找ID的属性。到目前为止,我找到的唯一解决方案是对AfterReceiveRequest的消息参数使用反射。这是可行的,只是看起来很奇怪,这不是一个公共财产
class MsmqLookupIdBehavior : IDispatchMessageInspector
{
static PropertyInfo lookupIdPropertyInfo;
static MsmqLookupIdBehavior()
{
try
{
var type = typeof(MsmqMessageProperty);
lookupIdPropertyInfo = type.GetProperty("LookupId", BindingFlags.NonPublic | BindingFlags.Instance);
}
catch { }
}
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
if (lookupIdPropertyInfo != null)
{
var lookupIds =
request.Properties.Values
.Where(p => p is MsmqMessageProperty)
.Select(p => lookupIdPropertyInfo.GetValue(p))
.Where(v => v is long)
.Select(v => (long)v);
foreach (var lookupId in lookupIds)
{
// Use lookupId here
}
}
return null;
}
// The rest of IDispatchMessageInspector here, not relevant for this behavior
}