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

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

| 我有一份带有以下合同的WCF服务:
[ServiceContract(Namespace=\"http://myNamespace.org/\")]
public interface IMyService
{
    [OperationContract]
    string Invert(string s);

    [OperationContract]
    string ToUpper(string s);
}
客户调用两种方法methods1ѭ和
ToUpper
。想象一下我想使用消息日志记录,但是我感兴趣的唯一方法是
ToUpper
,因为另一种方法被大量使用,并且记录所有消息会破坏日志;) 在这里,我阅读了如何过滤写入日志的消息。但是我肯定做错了,因为我的日志仍然是空的...我的配置看起来像这样
<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>
如果我应用此过滤器,则日志中不会有任何消息... 那么,关于上面的链接示例,我在做什么错呢? 如果没有过滤器,则默认消息(使用字符串参数“ 6”调用的方法“ 2”)的xml跟踪如下所示:
<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>
然后,我编辑了我的界面,并添加了方法“ 9”到“ 10”。然后我的目标是记录所有与
Method1
Method3
相关的消息之外的所有消息。我使用以下过滤器进行了此操作:
<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>
这样,仅记录与
Invert
ToUpper
Method2
相关的消息。 使用两个单独的过滤器来处理此问题可能是一种更干净的方法,但是目前我对此非常满意。     

解决方法

        您在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
根元素,因为您的表达式以
/
开头。我对框架不熟悉,它可能会从示例XML(肥皂内容)中选择一个子树,然后应用XPath过滤器。如果不是这种情况,并且您的XPath应该在给定的XML文档上产生匹配项,那么您应该以
//
或以
soap:Envelope
元素的路径(例如
/*/*/*/*/*/soap:Envelope
)开始表达式。首先使用
//
运算符效率低下,因为它需要遍历整个文档中的所有节点。     ,        非常感谢您提供有用的信息! 根据我自己的研究,要成功执行过滤,还必须强制执行以下关键点: 请勿以双\“ / \”开头的XPath表达式,否则过滤将根本无法进行。尽管对于XPath语法,此双\ /是正确的(与jasso指出的2011年5月27日23:06相同)。 不要依赖WCF配置编辑工具来为所涉及的xml名称空间选择别名。到现在为止发现\“ s12 \”不起作用,但是\“ s \”或\“ s1a \”是可以的(也许这是Microsoft所做的错误,我不确定)。     ,        XPath查询可能是问题所在。试试这个简单的版本:
<filters>
    <add xmlns:msgtr=\"http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace\" >//msgtr:SOAPAction[contains(.,\'ToUpper\')]</add>
</filters>
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-