0

IIS でホストされている WCF サービスがあり、netMsmqBinding. メッセージがサービスにディスパッチされる前に、 MSMQ ルックアップ IDをログに記録したいと考えています。この情報はどこで確認できますか?

にはMessageLookupIdプロパティがあるIErrorHandlerため、で取得します。例外をメッセージと関連付けるために、リクエストの開始時にログに記録する必要があります。MsmqPoisonMessageException

これには適切な場所だと思いましたが、ルックアップ ID を取得できるプロパティがAfterReceiveRequestIDispatchMessageInspectorメソッドに見つからないようです。

4

1 に答える 1

0

これまでのところ、私が見つけた唯一の解決策は、の Message パラメータでリフレクションを使用することです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 に答える