2008-08-04 135 views
20

我的两难问题基本上是如何在两个应用程序之间共享枚举。如何将枚举值传递给Web服务

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

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

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

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

回答

3

我只能说.net,但如果您有一个ASP.net Web服务,您应该能够直接添加一个枚举。

然后,当您在您的客户端应用程序使用“添加Web引用”,结果Class对象应包括枚举

但是,这是从我的头顶,我敢肯定,我已经做到了在过去,但我不能肯定地说。

+0

'添加Web引用'确实会创建枚举,但只会引用某些方法中引用的枚举。我可以手动将枚举添加到自动生成的Reference.cs文件,并且一切正常。也许这是单独的问题,但有什么办法可以让'添加Web引用'添加引用程序集中的所有枚举(但未在代码中使用),而无需手动黑客入侵Reference.cs文件? – 2010-12-07 14:43:22

6

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

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

6

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

只是一些无聊的例子来说明:

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

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

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

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

3

如果您正在使用.NET页面/应用程序使用Web服务,那么在将Web引用添加到使用服务的项目之后,应该可以访问该枚举。

0

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

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 - >代理生成器工具将其解析为客户端语言中的枚举等价物。

2

在这样的界面边界上没有使用enum s有一些相当好的理由。考虑关于这个主题的Dare's post