私は WCF サービス レイヤーに取り組んでいます。これは、メッセージ インスペクターを使用して、要求と応答の SOAP メッセージをログに記録します。
関係のないコードを取り除いたインスペクタを次に示します。
public class ServiceInspectorBehavior : Attribute, IDispatchMessageInspector, IServiceBehavior
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// pass request to BeforeSendReply method
return request.ToString();
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
string requestMessage = (string)correlationState;
string responseMessage = reply.ToString();
LogManager.Log(request, response);
}
}
MSMQで最適に機能する新しいビジネス要件が発生するまでは、すべて順調でした。そのため、現在 MSMQ エンドポイントを実装中です。ここでの問題は、メッセージが一方通行であることです。
[OperationContract(Name = "EnqueueRequest", IsOneWay = true)]
応答オブジェクトを作成しても、インスペクターの BeforeSendReply メソッドで「応答」は null になり、クライアントには何も返されません。
現時点でもっともらしいと思われる唯一のことは、ロギングをメッセージ インスペクタからメッセージ プロセッサ ロジックに移動し、そこでリクエストを処理してレスポンスを構築することです。ただし、可能であれば、現在の設定を維持することを好みます。
問題は、一見ありそうにないように見えますが、「MSMQ を使用して、インスペクターの BeforeSendReply メソッドのパラメーターに応答メッセージを含めることは可能ですか?」ということです。
前もって感謝します。よろしく。
編集 2015.08.27
Message Inspector を使用してロギングをやめました。今、私のサービス層にログインしています。これが私がやったことです。私はまだ提案を受け付けています。
public ResponseBase ProcessRequest(RequestBase requestObject)
{
string requestString = string.Empty;
string responseString = string.Empty;
try
{
requestString = DataContractSerializerHelper.SerializeObject(requestObject);
// ...
// Do magic stuff, build a response object, etc
// ...
responseString = DataContractSerializerHelper.SerializeObject(responseObject);
return responseObject;
}
catch(Exception e)
{
// Handle/log exception, return a default response, etc
}
finally
{
Logger.Log(requestString, responseString, ...);
}
}