私はちょうどいくつかのIDを持つWCFの着信メッセージと発信メッセージをバインドすると、何がデータベースに記録されます。WCFのメッセージインスペクタにパラメータ(ID)を渡すにはどうすればよいですか?
高いマルチスレッド環境で使用する予定だったため、いくつかの問題が発生しました。
POSTのEDIT
は、ここで私がログインする方法である:
public class LogMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
Dictionary<string, object> logParams = (Dictionary<string, object>)correlationState;
logParams["description"] = reply.ToString();
Logger log = LogManager.GetCurrentClassLogger();
log.InfoEx(String.Format("response_{0}", logParams["_action"]), logParams);
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
string iteration_id = "";
// here comes seeking for custom, previously setted header with id
for (int i = 0; i < request.Headers.Count; i++)
{
if ((request.Headers[i].Name == "_IterationId") && (request.Headers[i].Namespace == "http://tempuri2.org"))
{
iteration_id = request.Headers.GetHeader<string>(i);
request.Headers.RemoveAt(i);
break;
}
}
string pair_id = StringGenerator.RandomString(10);
string action_name = request.Headers.Action.Substring(request.Headers.Action.LastIndexOf("/") + 1);
Dictionary<string, object> logParams = new Dictionary<string,object>() { {"iteration_id", iteration_id}, { "description", request.ToString() }, { "request_response_pair", pair_id }, { "_action", action_name } };
Logger log = LogManager.GetCurrentClassLogger();
log.InfoEx(String.Format("request_{0}", action_name), logParams);
return logParams;
}
}
http://mattgemmell.com/2008/12/08/what-have-you-tried/ –
@SonerGönül実際、私はその問題を解決する方法も知らなかった: – kseen
すべてのWCF呼び出しにはそれに関連付けられた一意のID:OperationContext.Current.IncomingMessageHeaders.MessageId – Alexander