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

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

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

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

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

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

8 ответов

Решение

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

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

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

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

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

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

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}

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

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

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

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

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

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

Если вы не работаете с.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, чтобы разобрать это в эквивалент перечисления на языке клиента.

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

Другие вопросы по тегам