2011-05-27 17 views
5

Tengo un servicio de WCF con el siguiente contrato:WCF el registro de mensajes - añadir filtros con consultas XPath

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

    [OperationContract] 
    string ToUpper(string s); 
} 

clientes llaman ambos métodos, Invert y ToUpper. Imagine que quiero usar el registro de mensajes, pero el único método que me interesa es ToUpper ya que el otro método se usa mucho y registrar todos los mensajes volaría el registro;)

Here, leí cómo filtrar los mensajes que están escritos en el registro. Pero debo estar haciendo algo mal ya que mi registro permanece vacío ... Mi configuración se parece a esto

<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> 

Si aplico este filtro, no se destinarán un solo mensaje en el registro ... Entonces, ¿qué ¿Estoy haciendo mal con respecto al ejemplo vinculado más arriba?

Sin el filtro de la traza XML de un mensaje predeterminado (método ToUpper invoca con parámetro de cadena hello) tiene el siguiente aspecto:

<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> 

Actualización: Para para cada cuerpo que esté interesado en la solución, finalmente lo consiguió trabajo con la ayuda de Jasso, gracias:

<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> 

luego edité mi interfaz y añade los métodos Method1 hasta Method3. Mi objetivo era entonces registrar todo excepto los mensajes relacionados con Method1 y Method3. Lo hice con el siguiente filtro:

<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> 

De esta manera, sólo se registran los mensajes relacionados con Invert, ToUpper y Method2.

Puede ser un enfoque más limpio para manejar esto con dos filtros separados, pero por el momento estoy bastante contento con esto.

Respuesta

7

Está utilizando un espacio de nombre incorrecto para el elemento Action en su expresión XPath

Tienes

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

y el documento tiene

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

Entonces los espacios de nombres difieren, porque el elemento Action tiene una definición de espacio de nombre predeterminada adjunta.

También su XPath es la búsqueda de un elemento desoap:Enveloperaíz porque su expresión se inicia con una /. No estoy familiarizado con el marco, podría seleccionar un subárbol de su XML de ejemplo (el contenido de jabón) y luego aplicar el filtro XPath.Si este no es el caso y su XPath debe producir una coincidencia en ese documento XML dado, entonces debe comenzar la expresión con // o con una ruta al elemento soap:Envelope (como /*/*/*/*/*/soap:Envelope). Usar el operador // al principio es ineficiente ya que requiere pasar por todos los nodos en todo el documento.

+0

si pruebo este filtro '/soap:Envelope/soap:Header/a:Action[starts-with(text(),'http://myNamespace.org/IMyService/Invert ')] 'no habrá ingrese un solo mensaje en el registro:/ – khlr

+0

También su primer espacio de nombres (soap) es incorrecto. En lugar de 'http: // www.w3.org/2003/05/soap-envelope' su documento tiene' 'No me di cuenta de este otro error de espacio de nombres cuando escribí mi respuesta, lo siento. – jasso

+1

oh chico, estoy tan ciego ... tienes razón, si agrego el siguiente filtro, funciona como esperaba :) '/soap: Sobre/soap: Header/a: Action [starts-with (text(), 'http://myNamespace.org/IMyService/ToUpper')] '¡Gracias! – khlr

0

La consulta XPath es probablemente el problema. Prueba esta versión más simple:

<filters> 
    <add xmlns:msgtr="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace" >//msgtr:SOAPAction[contains(.,'ToUpper')]</add> 
</filters> 
+0

este filtro parece no tener ningún efecto. Si lo aplico, no hay ningún mensaje filtrado. Tiene el mismo efecto que si no aplicara filtro. – khlr

4

¡Muchísimas gracias por la información útil!

acuerdo con mi propio estudio, para realizar el filtrado con éxito, estos puntos clave debe hacerse cumplir así:

  1. no inicie la expresión XPath con doble "/", de lo contrario el filtrado no funcionará en todas. Aunque este doble "/" es correcto con respecto a la sintaxis de XPath (el mismo que señaló jasso el 27 de mayo 23:06, 2011).
  2. No confíe en la herramienta de Edición de Configuración WCF para elegir el alias para el espacio de nombres xml involucrado. Hasta ahora, se ha encontrado que "s12" no funciona, pero "s" o "s1a" están bien (quizás no sea cierto, es un error hecho por Microsoft).
Cuestiones relacionadas