none
Publicar WS con WFC y tipos de datos complejos RRS feed

  • Pregunta

  • Hola, buenos dias.

    Necesito publicar un web service, con WCF, para lo cual tengo una capa de servicios (biblioteca de servicios WFC con C#).

    pues bien, una vez que agrego el proyecto, se generan automaticamente una clase y una interface, las que renombre segun los nombres de sericios requetridos, y dentro puse las firmas de un metodo, y su implementacion.

    hasta ahi nada fuera de lo comun, exceltpo que, los parametros de entrada y salida de los metodos, tienen la caracteristca que no son tipos basicos (string, int, list..) si no que son estructuras complehas definidas en clases, basadas en el estandar HL7 (estandar en medicina)..

    el tema, es que al definir estos parametros, el proyecto compila sin problemas, pero al momento de "publicar" los servicios el cliente de prueba wcf, me indica un error (una x roja) que dice que "la operacion no se admite en el client de prueba wcf, porque usa el tipo HL7.ACKCONTENT... 

    efectivamente el tipo de valor que retorna el ws, es una estructura de HL7.ACKCONTENT (define estado del proceso)

    supuse que por estar esa clase HL7 definida en otro ensamblado, podria ser que el WS no tuviese la definicion, asi que la copie dentro del mismo proyecto, y cambien las referencias a local. y aun asi, no me permite usar ese tipo de datos.

    aclaro que para los parametros del WS, defini una clase que envolvia a la clase original (usando una interface) y decore la clase con [DataContract] y las variables con [DataMember]

    pense tb, que podria ser que por las caracteridticas de la clase hl7 especificamente de la clase ACKCONTENT, que tiene unos decoradores del tipo [System.Xml.Serialization.XmlElementAttribute("SFT")] pudiese ser que eso no le gusta añl wfc, y se los quite (para efectos de prueba) pero aun asi, nada, sigue sin funcionar...

    Aca pego una imagen de lo que me indica el cliente de prueba WCF

    aca dejo la definicion del dato que retorna la clase 

    
    /// <comentarios/>
        [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
        [System.SerializableAttribute()]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(TypeName = "ACK.CONTENT", Namespace = "urn:hl7-org:v2xml")]
        [System.Xml.Serialization.XmlRootAttribute("ACK", Namespace = "urn:hl7-org:v2xml", IsNullable = false)]
        public partial class ACKCONTENT
        {
    
            private MSHCONTENT mSHField;
    
            private SFTCONTENT[] sFTField;
    
            private MSACONTENT mSAField;
    
            private ERRCONTENT[] eRRField;
    
            /// <comentarios/>
            public MSHCONTENT MSH
            {
                get
                {
                    return this.mSHField;
                }
                set
                {
                    this.mSHField = value;
                }
            }
    
            /// <comentarios/>
            [System.Xml.Serialization.XmlElementAttribute("SFT")]
            public SFTCONTENT[] SFT
            {
                get
                {
                    return this.sFTField;
                }
                set
                {
                    this.sFTField = value;
                }
            }
    
            /// <comentarios/>
            public MSACONTENT MSA
            {
                get
                {
                    return this.mSAField;
                }
                set
                {
                    this.mSAField = value;
                }
            }
    
            /// <comentarios/>
            [System.Xml.Serialization.XmlElementAttribute("ERR")]
            public ERRCONTENT[] ERR
            {
                get
                {
                    return this.eRRField;
                }
                set
                {
                    this.eRRField = value;
                }
            }
        }
    


    Alguna idea de que pueda estar pasando ?

    Saludos y gracias


    viernes, 3 de marzo de 2017 14:26

Todas las respuestas

  • hola

    >>efectivamente el tipo de valor que retorna el ws, es una estructura de HL7.ACKCONTENT (define estado del proceso)

    pero de donde sale este HL7 ? son clases o estructuras que tu defines o son otro algun otro componente

    lo pregunto porque no deberias exponer en tu servicio algo que define un componente o libreria externo, deberias crear tu propia clases y exponenerlas como entrada\retorno del servicio de WCF

    despues internamente deberias mapear esta clase que tu defines con la estructura\clase que defina el componente externo HL7, para esto podrias hacerlo por codigo manualmente o sino ayudandote con la libreria automapper

    a donde apunto es que no expongas algo que tu no defines, ya que estarias rompiendo con el concepto de abstraccion

    saludis


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Joyce_AC viernes, 3 de marzo de 2017 15:04
    • Votado como útil Joyce_AC viernes, 3 de marzo de 2017 18:26
    viernes, 3 de marzo de 2017 14:47
  • Hola Leandro.

    mira, concuerdo con el tema que planteas de no exponer la estructura, ya que esta transgrediendo el concepto de abstraccion.. pero al ser un tipo de dato muy complejo, se me hace un lio tener que estar replicando a mano la estructura (son muchas clases, que tienen niveles de anidamiento muy profundos)

    Automapper, si bien, me ayudaria, en el proceso, tengo la restriccion por parte del cliente de no poder usarlo.
    por eso es que uso directamente la estructura de clases que mencionaba.

    por otra parte, hice una prueba tomando una clase de las mas sencillas del HL7 y la copie localmente en el proyecto wfc, y ahi si funciona. (decorandola con datamember y datacontract

    el tema es que como te comentaba anteriormente, estas clases son muy extensas, para estar copiando la estructuras de forma local, por eso que las estaba referenciando desde otro proyecto

    sabes si existe alguna opcion (solo estoy suponiendo) que me permita usar la estructura importada como dll referenciada desde otro proyecto?

    Saludos

    viernes, 3 de marzo de 2017 15:33