2010-10-18 6 views
18

estoy generando un servicio WCF utilizando el modelo de contrato de mensaje.¿Cómo puedo controlar el nombre genérico de un mensaje WCF Contrato

he creado un contrato mensaje de solicitud genérica de este modo:

[MessageContract] 
public Request<T> 
{ 
    [MessageBodyMember] 
    public T Details { get; set; } 
} 

Estoy acostumbrado a utilizar para producir [DataContract(Name="Contract{0}")] nombres legibles para los contratos de datos genéricos, pero no parece que este enfoque funcione para mí usando mensajes contratos.

¿Hay una manera de conseguir el mismo comportamiento utilizando el modelo de contrato de mensaje?

Respuesta

2

Hay una propiedad WrapperName y WrapperNamespace en el atributo MessageContract que creo que hace lo mismo. Por ejemplo,

[MessageContract(WrapperName = "FooMessage", IsWrapped = true)] 
public class Request<T> 
{ ... } 

Nota la adición de la propiedad IsWrapped para indicar que el mensaje debe ser serializado en el elemento de envoltura.

+0

Intenté esto usando WrapperName = "WrapperFor {0}", pero este resolvió con un nombre bastante desagradable en WSDL (el equivalente Unicode de {0}) y no realizó la traducción que esperaba. –

+0

Además, esto parece arrojar una excepción cuando 'T' también pasa a ser un tipo genérico y la propiedad' DataContract Name' usa marcadores de posición, p. 'GenericOf {0}'. Me interesaría saber si los contratos genéricos MessageContracts y DataContracts se pueden usar junto con los nombres genéricos anulados, así que le he dado una recompensa a esta pregunta. –

4

Parece que hay mucho trabajo para lo que quiere lograr, pero creo que puede crear un MessageInspector que le permitirá interactuar directamente con el XML.

Los inspectores de mensajes del cliente implementan la interfaz IClientMessageInspector y los inspectores de mensajes de servicio implementan la interfaz IDispatchMessageInspector.

http://msdn.microsoft.com/en-us/library/aa717047.aspx

Cualquier servicio (despachador) mensaje inspector debe aplicar los dos métodos IDispatchMessageInspectorAfterReceiveRequest y BeforeSendReply.

El enlace entra en mucho más detalles, pero una vez que haya implementado estos, debería poder agregar el inspector a su web.config y debería estar todo listo.

+1

. Creo que es posible que haya malentendido la pregunta. Dado que hay un MessageContract genérico, p. 'Solicitud ', ¿cómo se genera un nombre * clean * en el WSDL para entradas que son tipos genéricos cerrados de 'Request ' p. Ej. 'Solicitud '. Al OP le gustaría generar un nombre como 'RequestOfServiceInput' en el WSDL para el antiguo tipo genérico, pero parece que nombrar tipos genéricos para MessageContracts no funciona igual que DataContracts como se describe aquí: http://msdn.microsoft. com/en-us/library/ms731045.aspx # sectionSection4 –

+0

Puede estar en @RussCam. En ese caso, necesitaría usar 'IWsdlExportExtension' para personalizar/extender el WSDL. Puede encontrar un ejemplo de eso aquí: http: //blogs.msdn.com/b/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx – marcellscarlett

Cuestiones relacionadas