Tengo un servicio WCF con varios métodos. Me gustaría registrar la solicitud sin procesar que vino del cliente, independientemente de cómo se envió. Un método acepta los datos como una cadena de consulta (estrictamente para el soporte de legado), que puedo abrir una sesión usando:Cómo registrar la solicitud sin procesar en el servicio WCF
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
que es suficiente en ese escenario, pero otros métodos permiten que el cliente envíe datos como XML usando una clase de proxy generada por svcutil.exe. En este escenario he encontrado los datos que yo quiero en el s: Cuerpo de:
OperationContext.Current.RequestContext.RequestMessage
Desafortunadamente, no importa lo que intento no puedo crear una copia del mensaje tamponada antes de que se lee. He aquí un ejemplo:
public CascadeResponse SendCustomer(Customer c)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
}
En la primera línea de SendCustomer, sin embargo, me sale el siguiente error:
Este mensaje no puede soportar la operación, ya que se ha leído.
Este es el punto de la creación de la copia en búfer, ¿no? Supongo que estoy haciendo algo incorrecto aquí.
Editar:
Ok, por lo que el método es ahora así:
public CascadeResponse SendCustomer(Message requestMessage)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
Customer c = msg.GetBody<Customer>();
string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer
return SendLead(c, clientKey);
}
Mi problema es que no sé cómo sacar el Cliente y ClientKey enviado como entidades separadas. Podría hacer clientKey una propiedad del Cliente (o crear un objeto personalizado que sea específicamente para pasar datos y que contenga Customer y ClientKey como atributos), pero me gustaría evitar eso si es posible, ya que esta es una actualización de un sistema heredado que ya funciona de esta manera.
También estoy teniendo problemas para usar svcUtil.exe para crear mis clases proxy - Supongo que tener la firma del método anterior significa que mi servicio ya no anunciará la firma correcta para enviar las solicitudes como? No estoy seguro si eso es lo suficientemente claro: si mi único método de entrada acepta un objeto Message, ¿cómo sabe mi cliente enviar un Cliente y una ClientKey?
¿Alguna razón por la que no puede usar la función de seguimiento incorporada en WCF? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead
@DaveRead Principalmente, no lo sabía, ¿esto me permite guardar mis registros en una base de datos? – Maloric
No está deshabilitado, pero puede crear su propio TraceListener personalizado, consulte este artículo para obtener más información: http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead