如何将枚举值传递给Web服务

时间:2008-08-04 23:43:35

标签: web-services application-integration

我的困境基本上是如何在两个应用程序之间共享枚举。

用户通过Web上的前端应用程序上载文档。此应用程序调用后端应用程序的Web服务并将文档传递给它。后端应用程序保存文档并在 Document 表中插入一行。

文档类型(7种可能的文档类型:发票合同等)作为参数传递给Web服务的 UploadDocument 方法。问题是,该参数的类型(和可能的值)应该是什么?

由于您需要在两个应用程序中对这些值进行硬编码,我认为它是O.K.使用描述性字符串(发票合同 WorkOrder SignedWorkOrder )。

在第一个应用程序中创建 DocumentTypes 枚举并在第二个应用程序中重现它,然后将相应的整数值传递给它们之间的Web服务可能是更好的方法吗?

8 个答案:

答案 0 :(得分:5)

我建议不要在它们之间传递一个整数,只是出于可读性和调试的目的。假设您正在浏览日志,并且您看到DocumentType = 4的一堆500错误。现在你必须去查找哪个DocumentType是4.或者如果其中一个应用程序引用了另一个不存在的数字,可能是由于版本不匹配。

这是一个更多的代码,它使大脑的静态类型部分有点粗糙,但在HTTP之上的协议中,所接受的智慧是在不透明的枚举上使用清晰的字符串。

答案 1 :(得分:5)

我仍会在内部使用枚举,但希望消费者只传递名称,而不是数字值本身。

只是一些愚蠢的例子来说明:

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

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

答案 2 :(得分:3)

如果您不使用.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决定 - &gt;代理生成器工具将其解析为客户端语言中的枚举。

答案 3 :(得分:3)

如果您从.NET页面/应用程序中使用Web服务,则在将Web引用添加到使用该服务的项目后,您应该能够访问该枚举。

答案 4 :(得分:3)

我只能谈论.net,但如果你有一个ASP.net Web服务,你应该可以直接添加一个枚举。

当您在客户端应用程序中使用“添加Web引用”时,生成的类应包含该枚举

但这是我的头脑,我很确定我过去已经做过,但我不能肯定地说。

答案 5 :(得分:3)

在.NET中,枚举值(默认情况下)序列化为带有名称的xml。对于可以有多个值(flags)的情况,它会在值之间放置一个空格。这是因为枚举不包含空格,所以你可以通过拆分字符串来重新获得值(即“Invoice Contract SignedWorkOrder”,使用lubos的例子)。

您可以使用XmlEnumAttribute控制asp.net Web服务的值序列化,或使用WCF时使用EnumMember属性。

答案 6 :(得分:2)

在这样的接口边界上不使用enum有一些很好的理由。考虑Dare's post关于这个问题。

答案 7 :(得分:0)

我注意到当使用“添加服务引用”而不是VS.net中的“添加Web引用”时,实际的枚举值以及枚举名称都会出现。这真的很烦人,因为我需要支持2.0和3.5客户端。我最终不得不进入2.0生成的Web服务代理代码,并在每次进行更改时手动添加枚举值!