Как передать перечисляемые значения в веб-сервис

Моя дилемма заключается в том, как разделить перечисление между двумя приложениями.

Пользователи загружают документы через интерфейсное приложение, которое находится в Интернете. Это приложение вызывает веб-сервис внутреннего приложения и передает ему документ. Внутреннее приложение сохраняет документ и вставляет строку в таблицу « Документ» .

Тип документа (7 возможных типов документов: Счет-фактура , Контракт и т. Д.) Передается в качестве параметра в метод UploadDocument веб-службы . Вопрос в том, каким должен быть тип (и возможные значения) этого параметра?

Поскольку вам необходимо жестко закодировать эти значения в обоих приложениях, я думаю, что можно использовать описательную строку ( Invoice , Contract , WorkOrder , SignedWorkOrder ).

Может ли быть лучшим подходом создать перечисление DocumentTypes в первом приложении и воспроизвести его также во втором приложении, а затем передать соответствующее целочисленное значение веб-службе между ними?

4.08.2008 23:43:34
8 ОТВЕТОВ
РЕШЕНИЕ

Я могу говорить только о .net, но если у вас есть веб-сервис ASP.net, вы сможете добавить перечисление непосредственно к нему.

Когда вы затем используете «Добавить веб-ссылку» в своем клиентском приложении, результирующий класс должен включать это перечисление

Но это из головы, я почти уверен, что делал это в прошлом, но точно сказать не могу.

3
4.08.2008 23:56:54
«Добавить веб-ссылку» создает перечисления, но только те, на которые ссылается какой-либо метод. Я могу вручную добавить перечисления в автоматически сгенерированный файл Reference.cs, и все работает хорошо. Может быть, это отдельный вопрос, но есть ли способ получить «Добавить веб-ссылку», чтобы добавить все перечисления в ссылочной сборке (но не использованной в коде), не взламывая файл Reference.cs вручную?
Dave M 7.12.2010 14:43:22
@Dave Web Services инкапсулируют методы, поэтому, если нет методов, использующих Enum, нет смысла - с точки зрения Web Service - ссылаться на него. Я рекомендую задать отдельный вопрос с описанием того, что вы хотите сделать / почему вы хотите ссылаться на перечисление без ссылок.
Michael Stum♦ 7.12.2010 22:47:35

Я бы посоветовал не передавать между ними целое число просто для удобства чтения и отладки. Допустим, вы просматриваете свои журналы и видите 500 ошибок для DocumentType = 4. Теперь вам нужно посмотреть, какой DocumentType равен 4. Или, если одно из приложений ссылается на число, которого нет в другом, возможно, из-за несовпадения версий.

Это немного больше кода, и он немного стирает статическую типизирующую часть мозга, но в протоколах поверх HTTP полученная мудрость состоит в том, чтобы принять разборчивые строки поверх непрозрачных перечислений.

6
4.08.2008 23:54:12

Я бы все еще использовал перечисление для внутреннего использования, но ожидал бы, что потребители передадут мне только имя, а не само числовое значение.

просто глупый пример для иллюстрации:

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

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
5
5.08.2008 00:16:36

В .NET значения перечисления (по умолчанию) сериализуются в xml с именем. Для случаев, когда у вас может быть несколько значений ( флагов ), тогда между значениями ставится пробел. Это работает, потому что перечисление не содержит пробелов, поэтому вы можете получить значение снова, разделив строку (например, «Invoice Contract SignedWorkOrder», используя пример lubos).

Вы можете контролировать сериализацию значений в веб-службах asp.net с помощью атрибута XmlEnumAttribute или атрибута EnumMember при использовании WCF.

3
5.08.2008 01:26:14

Если вы используете ваш веб-сервис из .NET-страницы / приложения, вы сможете получить доступ к перечислению после добавления веб-ссылки на проект, который использует сервис.

3
5.08.2008 01:34:40

Я заметил, что при использовании «Добавить ссылку на службу», а не «Добавить веб-ссылку» из VS.net, фактические значения перечисления, а также имена перечисления. Это действительно раздражает, так как мне нужно поддерживать клиентов 2.0 и 3.5. В конечном итоге мне приходится заходить в сгенерированный прокси-код веб-службы 2.0 и вручную добавлять значения enum каждый раз, когда я делаю изменения!

0
7.09.2008 23:21:15

Если вы не работаете с .NET в .NET SOAP, вы все равно можете определить перечислитель, если обе конечные точки используют 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>

Это до инструмента генератора WSDL -> Proxy, чтобы разобрать это в эквивалент перечисления на языке клиента.

3
7.09.2008 23:38:16

Есть несколько довольно веских причин не использовать enums на границе интерфейса, как это. Рассмотрим пост Дейра на эту тему.

2
8.09.2008 12:35:03