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