Como passar valores enumerados para um serviço web

votos
20

Meu dilema é, basicamente, como compartilhar uma enumeração entre duas aplicações.

Os usuários fazer upload de documentos através de um aplicativo front-end que está na web. Este aplicativo chama um serviço de web do aplicativo back-end e passa o documento para ele. O aplicativo back-end salva o documento e insere uma linha no documento mesa.

O tipo de documento (7 possíveis tipos de documentos: fatura , contrato etc.) é passado como um parâmetro para o serviço Web UploadDocument método. A questão é, o que deve o tipo (e possíveis valores) deste parâmetro ser?

Desde que você precisa para codificar estes valores em ambas as aplicações, eu acho que é OK para usar uma cadeia descritiva ( fatura , contrato , WorkOrder , SignedWorkOrder ).

É talvez a melhor abordagem para criar uma DocumentTypes enumeração na primeira aplicação, e reproduzi-lo também na segunda aplicação, e, em seguida, passar o valor inteiro correspondente ao serviço web entre eles?

Publicado 05/08/2008 em 00:43
fonte usuário
Em outras línguas...                            


8 respostas

votos
6

Eu ainda iria usar enumeração internamente, mas seria de esperar que os consumidores a passar-me apenas o nome, não o próprio valor numérico.

apenas algumas exemplo bobo para ilustrar:

public enum DocumentType
{
  Invoice,
  Contract,
  WorkOrder,
  SignedWorkOrder
}

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
Respondeu 05/08/2008 em 01:12
fonte usuário

votos
6

Eu sugiro contra passando um inteiro entre eles, simplesmente para fins de legibilidade e depuração. Digamos que você está passando por seus logs e você verá um monte de 500 erros para DocumentType = 4. Agora você tem que ir olhar para cima que DocumentType é 4. Ou se um dos aplicativos refere-se a um número que não existe na outra, talvez devido a versões incompatíveis.

É um pouco mais de código, e ele esfrega a parte de tipagem estática do cérebro um pouco cru, mas em protocolos em cima de HTTP a sabedoria recebida é a lado com cordas legíveis sobre enumerações opacos.

Respondeu 05/08/2008 em 00:54
fonte usuário

votos
3

Se você não está trabalhando com .NET para .NET SOAP, você ainda pode definir um enumerador desde que ambos os pontos finais estão usando WSDL.

<s:simpleType name="MyEnum">    
     <s:restriction base="s:string">
          <s:enumeration value="Wow"/>
          <s:enumeration value="This"/>
          <s:enumeration value="Is"/>
          <s:enumeration value="Really"/>
          <s:enumeration value="Simple"/>
     </s:restriction>
</s:simpleType>

Seu até o WSDL -> ferramenta de gerador de Proxy para analisar isso em um equivalente enum no idioma do cliente.

Respondeu 08/09/2008 em 00:38
fonte usuário

votos
3

Se você está consumindo o seu serviço Web a partir de uma página NET / aplicativo, você deve ser capaz de acessar a enumeração após adicionar sua referência Web para o projeto que está consumindo o serviço.

Respondeu 05/08/2008 em 02:34
fonte usuário

votos
3

Em .NET, valores de enumeração são (por padrão) serializados em xml com o nome. Para os casos onde você pode ter vários valores ( bandeiras ), então ele coloca um espaço entre os valores. Isso funciona porque a enumeração não contém espaços, para que possa obter o valor novamente dividindo a string (ie. "Fatura contrato SignedWorkOrder", usando o exemplo de Lubos).

Você pode controlar a serialização de valores de serviços asp.net web usando o XmlEnumAttribute , ou usando o EnumMember atributo quando usando WCF.

Respondeu 05/08/2008 em 02:26
fonte usuário

votos
3

Eu só posso falar sobre .net, mas se você tiver um Webservice ASP.net, você deve ser capaz de adicionar uma enumeração diretamente a ele.

Quando você, em seguida, usar o "Add Web Reference" em seu aplicativo cliente, a classe resultante deve incluir essa enumeração

Mas esta é a partir do topo da minha cabeça, eu tenho certeza que eu tenho feito isso no passado, mas eu não posso dizer com certeza.

Respondeu 05/08/2008 em 00:56
fonte usuário

votos
2

Há algumas bastante boas razões para não usar enums em um limite de interface assim. Considere Dare postar sobre o assunto.

Respondeu 08/09/2008 em 13:35
fonte usuário

votos
0

Tenho notado que quando se usa "Add Service Reference" em oposição a "Add Web Reference" do VS.net, os valores enum reais se deparar, bem como os nomes de enum. Este é realmente irritante como eu preciso para apoiar ambos os clientes 2.0 e 3.5. Eu acabar tendo que ir para o código de proxy de serviço 2.0 gerado web e adicionar manualmente os valores enum cada vez que eu fazer uma mudança!

Respondeu 08/09/2008 em 00:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more