0

我们有一个托管在 IIS 中的 WCF 服务,该服务具有netMsmqBinding. 在将消息发送到我们的服务之前,我们希望记录MSMQ 查找 ID。我在哪里可以找到这些信息?

我们得到它是IErrorHandler因为 anMsmqPoisonMessageException有一个MessageLookupId属性。我们需要在请求开始时记录它,以便将异常与消息关联起来。

我认为 anIDispatchMessageInspector是合适的地方,但我似乎无法在AfterReceiveRequest方法中找到任何可以为我提供查找 ID 的属性。

4

1 回答 1

0

到目前为止,我发现的唯一解决方案是对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
}
于 2015-03-06T19:37:22.417 回答