我编写了一个ClientMessageInspector,它是在我可以开始工作的示例Message Inspection in WCF之后建模的。我有一个服务,是其他服务的客户端。它位于“Interface12ServiceProject”项目中。 MessageInspector是:
namespace MessageListener.Instrumentation
{
public class MessageInspector : IClientMessageInspector
{
private const string LogDir = @"C:\Logs\Interface12Service\";
private Message TraceMessage(MessageBuffer buffer)
{
// Must use a buffer rather than the original message, because the Message's body can be processed only once.
Message msg = buffer.CreateMessage();
//Setup StringWriter to use as input for our StreamWriter
//This is needed in order to capture the body of the message, because the body is streamed
StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);
msg.WriteMessage(xmlTextWriter);
xmlTextWriter.Flush();
xmlTextWriter.Close();
//Setup filename to write to
if (!Directory.Exists(LogDir))
Directory.CreateDirectory(LogDir);
DateTime now = DateTime.Now;
string datePart = now.Year.ToString() + '-' + now.Month.ToString() + '-' + now.Day.ToString() + '-' + now.Hour + '-' + now.Minute + '-' + now.Second;
string fileName = LogDir + "\\" + datePart + '-' + "SoapEnv.xml";
//Write to file
using (StreamWriter sw = new StreamWriter(fileName))
sw.Write(stringWriter.ToString());
//Return copy of origonal message with unalterd State
return buffer.CreateMessage();
}
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
reply = TraceMessage(reply.CreateBufferedCopy(int.MaxValue));
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
request = TraceMessage(request.CreateBufferedCopy(int.MaxValue));
return null;
}
}
}
然后我有一个LoggingEndpointBehavior:
namespace MessageListener.Instrumentation
{
public class LoggingEndpointBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
throw new NotImplementedException();
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
MessageInspector inspector = new MessageInspector();
clientRuntime.MessageInspectors.Add(inspector);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
throw new NotImplementedException();
}
public void Validate(ServiceEndpoint endpoint)
{
throw new NotImplementedException();
}
}
}
然后是LoggingBehaviorExtenhsionElement:
namespace MessageListener.Instrumentation
{
public class LoggingBehaviorExtensionElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof (LoggingEndpointBehavior); }
}
protected override object CreateBehavior()
{
return new LoggingEndpointBehavior();
}
}
}
最后,相关配置是:
<client>
<endpoint address="..."
binding="basicHttpBinding" bindingConfiguration="Tier2DocumentEndpointImplServiceSoapBinding"
contract="SSHIPProdInterface12.Tier2DocumentEndpoint" name="Tier2DocumentEndpointImplPort" behaviorConfiguration="messageInspectorBehavior"/>
<endpointBehaviors>
<behavior name="messageInspectorBehavior">
<messageInspector />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="messageInspector" type="MessageListener.Instrumentation.LoggingBehaviorExtensionElement, Interface12ServiceProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
当我运行Interface12Service并尝试使用附加的endpointBehavior调用其他服务时:
serviceResponse = client.getTier2Document(authHeader, arg1);
我得到“方法或操作未实现”异常,我在MessageInspector中的断点永远不会变热。当我取消endpointBehavior时,对其他服务的调用成功但没有消息检查。我究竟做错了什么?我可以用这种方式将我的行为附加到服务上吗?
答案 0 :(得分:1)
我通过查看堆栈异常找到了答案:Validate抛出NotImplementedException