Pergunta

Existe uma maneira de especificar os tipos a serem usados ​​ao criar serviços da Web?Especificamente, quero poder usar o mesmo tipo no cliente e no servidor para reduzir a duplicação de código.

Exemplo simplificado:

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

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

Não quero que peças de funcionalidade sejam recodificadas em minha classe.A outra coisa é que qualquer código existente que manipule essa classe não funcionará no lado do cliente, pois a classe do lado do cliente gerada seria de um tipo diferente.

Foi útil?

Solução

Ok, sei que esta foi uma decisão de design explícita por parte do SOAP, então você não deveria fazer isso.Eu encontrei o seguinte página isso explica o porquê:

Esquema e contrato de compartilhamento de serviços, não classe.Os serviços interagem exclusivamente em sua expressão de estruturas através de esquemas e comportamentos através de Contratos.O contrato do serviço descreve a estrutura das mensagens e restrições de ordenação sobre Mensagens.A formalidade do expression permite verificação de máquina de mensagens recebidas.Máquina verificação de mensagens recebidas permite que você proteja o serviço integridade.Contratos e esquemas devem permanecer estável ao longo do tempo, por isso construir A flexibilidade é importante.

Dito isto, existem duas outras possibilidades:

  1. Gere as referências da Web no Visual Studio ou usando wsdl.exe.Em seguida, vá para o arquivo Reference.cs (ou .vb) gerado e exclua o tipo explicitamente.Em seguida, redirecione para o tipo que você deseja que esteja localizado em outra montagem.
  2. Você pode compartilhar tipos entre serviços da Web no lado do cliente por meio de wsdl.exe e do parâmetro /sharetypes.

Outras dicas

Se você deseja ter um tipo ou estrutura compartilhada entre seu serviço da web e seu cliente, adicione uma estrutura pública ao seu projeto de serviço da web como assim:

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

Em seguida, adicione um método ao seu serviço da Web com essa estrutura como seu tipo de retorno:

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

Depois de atualizar a referência da Web do seu cliente, você poderá criar estruturas de tipo em seu aplicativo cliente como assim:

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

Essa técnica permite manter a definição de qualquer estrutura necessária para passar em um só lugar (o projeto de serviço da web).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top