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

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

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

Тип документа (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);
}

Есть несколько довольно веских причин не использовать enum s на такой границе интерфейса. Обратите внимание на пост Dare по этой теме.

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

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

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

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

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

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