Pregunta

¿Existe alguna forma de especificar los tipos a utilizar al crear servicios web?Específicamente, quiero poder usar el mismo tipo tanto en el cliente como en el servidor para reducir la duplicación de código.

Ejemplo demasiado simplificado:

    public class Name
    {
        public string FirstName {get; set;}
        public string Surname { get; set; }

        public override string ToString()
        {
            return string.Concat(FirstName, " ", Surname);
        }
    }

No quiero tener que recodificar piezas de funcionalidad en mi clase.La otra cosa es que cualquier código que exista que manipule esta clase no funcionará en el lado del cliente ya que la clase del lado del cliente que se genera sería de un tipo diferente.

¿Fue útil?

Solución

Bien, ya veo que esta ha sido una decisión de diseño explícita por parte de SOAP, por lo que en realidad no se supone que lo hagas.encontré lo siguiente página eso explica por qué:

Servicios comparten esquema y contrato, no clase.Los servicios interactúan únicamente en su expresión de estructuras a través de esquemas y comportamientos a través de contratos.El contrato del Servicio describe la estructura de los mensajes y las limitaciones de pedido sobre los mensajes.La formalidad de la expresión permite la verificación de la máquina de los mensajes entrantes.La verificación de la máquina de mensajes entrantes le permite proteger la integridad del servicio.Los contratos y los esquemas deben permanecer estables con el tiempo, por lo que es importante construirlos de manera flexible.

Dicho esto, existen otras dos posibilidades:

  1. Genere las referencias web en Visual Studio o usando wsdl.exe.Luego vaya al archivo Reference.cs (o .vb) generado y elimine el tipo explícitamente.Luego redirija al tipo que desea que esté ubicado en otro ensamblaje.
  2. Puede compartir tipos entre servicios web en el lado del cliente mediante wsdl.exe y el parámetro /sharetypes.

Otros consejos

Si desea tener un tipo o estructura compartida entre su servicio web y su cliente, agregue una estructura pública a su proyecto de servicio web como esta:

public struct Whatever
{
    public string A;
    public int B;
}

luego agregue un método a su servicio web que tenga esta estructura como tipo de retorno:

[WebMethod]
public Whatever GiveMeWhatever()
{
    Whatever what = new Whatever();
    what.A = "A";
    what.B = 42;
    return what;
}

Después de actualizar la referencia web de su cliente, podrá crear estructuras de tipo Lo que sea en su aplicación cliente de esta manera:

Webreference.Whatever what = new Webreference.Whatever();
what.A = "that works?";
what.B = -1; // FILENOTFOUND

Esta técnica le permite mantener la definición de cualquier estructura que necesite pasar de un lado a otro en un solo lugar (el proyecto de servicio web).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top