gpt4 book ai didi

WCF 消息记录 - 使用 XPath 查询添加过滤器

转载 作者:行者123 更新时间:2023-12-01 23:20:01 33 4
gpt4 key购买 nike

我有一个具有以下契约(Contract)的 WCF 服务:

[ServiceContract(Namespace="http://myNamespace.org/")]
public interface IMyService
{
[OperationContract]
string Invert(string s);

[OperationContract]
string ToUpper(string s);
}

客户端调用两个方法:InvertToUpper。想象一下,我想使用消息日志记录,但我唯一感兴趣的方法是 ToUpper,因为其他方法被大量使用,并且记录所有消息会破坏日志;)

Here ,我阅读了如何过滤写入日志的消息。但我一定做错了什么,因为我的日志仍然是空的......我的配置看起来像这样

<system.serviceModel>
...
<diagnostics>
<messageLogging logEntireMessage="true" logMessagesAtServiceLevel="false" logMalformedMessages="true" logMessagesAtTransportLevel="true">
<filters>
<add xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/ToUpper')]</add>
</filters>
</messageLogging>
</diagnostics>

</system.serviceModel>

<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="ServiceModelTraceListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="LogServer.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="ServiceModelTraceListener" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>

如果我应用此过滤器,日志中不会出现任何消​​息...那么对于上面的链接示例我做错了什么?

如果没有过滤器,默认消息的 xml 跟踪(使用字符串参数 hello 调用的方法 ToUpper)如下所示:

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>0</EventID>
<Type>3</Type>
<SubType Name="Information">0</SubType>
<Level>8</Level>
<TimeCreated SystemTime="2011-05-27T17:53:53.9908714Z" />
<Source Name="System.ServiceModel.MessageLogging" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessName="WcfLoggingTest.Host.vshost" ProcessID="4324" ThreadID="12" />
<Channel />
<Computer>MY-Machine</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<MessageLogTraceRecord Time="2011-05-27T19:53:53.9908714+02:00" Source="TransportReceive" Type="System.ServiceModel.Channels.BufferedMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<HttpRequest>
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<VsDebuggerCausalityData>uIDPozEtlPQCjkhCodYdPWh6joUAAAAAamILDP7v3kG5sY6zKsB7HPPiLBWr+AVGmfFDQbk8GYAACQAA</VsDebuggerCausalityData>
<SOAPAction>"http://myNamespace.org/IMyService/ToUpper"</SOAPAction>
<Content-Length>157</Content-Length>
<Content-Type>text/xml; charset=utf-8</Content-Type>
<Accept-Encoding>gzip, deflate</Accept-Encoding>
<Expect>100-continue</Expect>
<Host>localhost:8731</Host>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8731/Design_Time_Addresses/MyService/</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://myNamespace.org/IMyService/ToUpper</Action>
</s:Header>
<s:Body>
<ToUpper xmlns="http://myNamespace.org/">
<s>hello</s>
</ToUpper>
</s:Body>
</s:Envelope>
</MessageLogTraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>

更新:对于每一个对该解决方案感兴趣的人,我终于在 jasso 的帮助下得到了它,谢谢:

<add xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/ToUpper')]</add>

然后,我编辑了界面并添加了方法 Method1 直到 Method3。我的目标是记录除与 Method1Method3 相关的消息之外的所有内容。我使用以下过滤器做到了这一点:

<add xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/Method1')=false() and starts-with(text(),'http://myNamespace.org/IMyService/Method3')=false()]</add>

这样,仅记录与 InvertToUpperMethod2 相关的消息。

使用两个单独的过滤器来处理这个问题可能是一种更干净的方法,但目前我对此非常满意。

最佳答案

您在 XPath 表达式中为 Action 元素使用了错误的命名空间

你有

xmlns:a="http://www.w3.org/2005/08/addressing"
... /a:Action[starts-with ...

文档有

<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">

因此命名空间有所不同,因为 Action 元素附加了默认命名空间定义。

此外,您的 XPath 正在搜索 soap:Envelope root 元素,因为您的表达式以 / 开头。我不熟悉该框架,它可能会从示例 XML(soap 内容)中选择一个子树,然后应用 XPath 过滤器。如果情况并非如此,并且您的 XPath 应该在给定的 XML 文档上生成匹配项,那么您应该以 //soap:Envelope 的路径开始表达式元素(如 /*/*/*/*/*/soap:Envelope)。在开始时使用 // 运算符效率很低,因为它需要遍历整个文档中的所有节点。

关于WCF 消息记录 - 使用 XPath 查询添加过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6156088/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com