0

応答なしでリクエストをログに記録する必要があります (タイムアウトの場合)。これを行うために IClientMessageInspector の実装を使用しています。残念ながら、AfterReceiveReply が呼び出されない 2 番目のケースがあります。サービス メソッドが void (何も返さない) の場合です。BeforeSendRequest メソッドで void メソッドを認識する方法はありますか?

4

1 に答える 1

0

そうするためのきれいな方法はありませんが、私は醜いものを見つけました:)

    /// <summary>
    /// Checks internal operation formatter for action reply attribute which is empty for one way methods.
    /// Based on above returns whether service method will have reply or not.
    /// </summary>
    /// <param name="request">Request message.</param>
    /// <returns>Whether service method will have reply.</returns>
    private bool WillRequestHaveReply(Message request)
    {
        FieldInfo operationFormatterField =
            request.GetType()
                .GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
                .FirstOrDefault(f => f.Name == "operationFormatter");

        if (operationFormatterField != null)
        {
            object operationFormatter = operationFormatterField.GetValue(request);
            if (operationFormatter != null)
            {
                PropertyInfo actionReplyProperty =
                    operationFormatter.GetType()
                        .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)
                        .FirstOrDefault(p => p.Name == "ReplyAction");

                if (actionReplyProperty != null)
                {
                    return actionReplyProperty.GetValue(operationFormatter) != null;
                }
            }
        }

        // Every request should have operationFormatter inside.
        // Use standard behaviour (requests with replies) if it doesn't.
        return true;
    }
于 2015-03-19T15:52:30.143 に答える