2009-04-22 17 views
16

Para los parámetros de un OperationContract que representan solo una fecha (sin componente de tiempo o designador de zona horaria), es conveniente usar xs: Date para evitar ambigüedades o problemas con la conversión de zona horaria entre el cliente y el servidor.Cómo generar xs: Fecha en WCF Parámetro OperationContract

WCF actualmente solo es compatible con xs: DateTime para serializar los parámetros de DateTime.

¿Cuál es la forma más fácil de generar un OperationContract con un parámetro que se serializará como xs: Date?

Estoy pensando en tener un .NET personalizado tipo "public struct DateOnly" o similar, con conversión implícita a/desde un DateTime estándar, que de alguna manera generará automáticamente wsdl como xs: Date.

¿Es esto posible y cómo voy a implementarlo?

Si es posible, sospecho que la solución podría implicar el uso de XmlSchemaProviderAttribute en el tipo personalizado, pero cualquier documentación que he encontrado en este atributo parece un poco opaca.

actualización

Me resulta difícil creer que esto aumenta el probablity de conseguir una solución, pero voy a seguir el consejo del sitio y empezar una recompensa.

Por el bien de la claridad, la condición para la recompensa es proporcionar toda la información necesaria para construir una solución para que un parámetro a un WCF OperationContract puede ser:

  • serializado como ws: Fecha y se describe como tal en el WSDL generado.

  • es un valor System.DateTime o se puede convertir implícitamente en/desde DateTime.

+0

Encontré una sugerencia de conexión cerrada en https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215. –

Respuesta

1

Desafortunadamente WCF no es compatible con xs: tipo de fecha. Habría que crear su propia estructura "DateOnly", como:

<DataContract()> _ 
public struct DateOnly 
    <DataMember()> public Month as Integer 
    <DataMember()> public Day as Integer 
    <DataMember()> public Year as Integer 
end struct 
+0

Sí, pensé que necesitaría crear mi propia estructura, pero quiero hacer que se serialice como xs: ¿Fecha (usando serialización XML personalizada)? Para que los clientes que no son WCF que reconocen xs: Date no necesiten otro tipo personalizado. – Joe

+0

No tengo conocimiento de ninguna forma de cambiar eso, excepto por la modificación del XML del WSDL sobre la marcha. Aunque no estoy seguro de las implicaciones de rendimiento. Este artículo no aborda completamente su situación, pero puede ayudarlo a comenzar a modificar el contenido del mensaje SOAP. http://blogs.msdn.com/kaevans/archive/2008/01/08/modify-message-content-with-wcf.aspx – Keith

1

serializador defaut de WCF (DataContractSerializer) no lo soporte. Pero XmlSerializer lo admite.

1 - Añadir el atributo [XmlSerializerFormat] a su contrato ...

[XmlSerializerFormat] 
[ServiceContract] 
public interface IMyContract 
{ 
    MyType GetData(); 
} 

2 - En el tipo DataContract, añadir el [XmlElement (Tipo de datos = "fecha")] para el miembro.

public class MyType 
{ 
    [XmlElement(DataType = "date")] 
    public DateTime BirthDate {get; set;} 
} 

Esperanza esto ayuda

+0

Esto no ayuda con los parámetros de fecha en un OperationContract. – Joe

+1

Lo siento, no me di cuenta de que hablabas del parámetro simple DateTime. ¿Pero no tendrá el mismo problema con sus tipos complejos si no cambia a [XmlSerializerFormat]? – Sylvain

+0

Sí, existe el mismo problema para DataMembers y para los parámetros de OperationContract. Para DataMembers, el uso de Serialización XML es una solución (incluso si pierde algunos de los beneficios de DataContracts). Pero estoy buscando una solución que funcione en ambos casos, en espera de la solución que Microsoft está considerando para "v.Next": https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215 – Joe

5

Ahora que esto ha llegado a mi conocimiento, he creado una nueva sugerencia de Contacto, en Please Fully Support xs:Date for Date-Only Parameters and DataMembers. Califiqué esto con cuatro estrellas (importante).

Si alguien que lee esto siente que esto es importante (o no está de acuerdo), utilice Conectar para votar o comentar sobre él.

+0

FYI: Califiqué tu sugerencia de Connect 4 estrellas también. – Sylvain

+0

Ciertamente creo que es importante. En su sugerencia de conexión, declara que "Sé que se puede usar [XmlSerializationFormat] para hacer que se utilice el Serializador XML en lugar del Serializador de Contrato de Datos". Si bien esto es una solución para DataContracts, tengo entendido que no hay una forma de especificar la serialización XML para los parámetros del contrato de operación. ¿Es este entendimiento correcto? En cualquier caso, la respuesta de MS a la sugerencia de Connect original (cerrada) indica que están considerando esto para "v.Next" (no estoy seguro si esto significa V4 o la siguiente versión). – Joe

+0

Creo que es posible configurar todo el contrato de servicio, servicio o punto final para usar el serializador xml. No estoy muy seguro de cómo. –

3

Ha especificado un requisito para tener xs: Date como parámetro en la operación. El caso es que hay una forma formal de especificar dichos requisitos: WSDL. Si estuviera haciendo esto, utilizaría un enfoque WSDL First. Comience con un WSDL que defina el contrato que desea, incluyendo un xs: date en la interfaz, donde sea que lo desee. A continuación, genere el código auxiliar de servicio utilizando svcutil.exe. Recuerde pasar/serializador: xmlSerializer.

Cuestiones relacionadas