application integration -如何将枚举值传递给web服务

Translate

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

用户通过Web上的前端应用程序上载文档。该应用程序调用后端应用程序的Web服务,并将文档传递给它。后端应用程序会保存文档,并在文件表。

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

由于您需要在两个应用程序中对这些值进行硬编码,因此我认为可以使用描述性字符串(发票, 合同, 工作指示, 签署的工作单)。

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

我只能说.net,但是如果您有ASP.net Web服务,则应该可以直接向其中添加枚举。

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

但这是从我的脑海中浮现出来的,我敢肯定我过去做过,但是我不能肯定地说。

来源
Translate

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

它需要更多的代码,并且使大脑的静态类型部分变得有些生疏,但是在HTTP之上的协议中,公认的智慧是在不透明的枚举上加上清晰的字符串。

来源
Translate

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

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

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

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

在.NET中,枚举值(默认情况下)使用名称序列化为xml。如果您可以有多个值(标志),然后在值之间放置一个空格。这是可行的,因为枚举不包含空格,因此您可以通过分割字符串来再次获取值(例如,使用lubos的示例为“ Invoice Contract SignedWorkOrder”)。

您可以使用以下命令控制asp.net Web服务中的值的序列化XmlEnumAttribute,或使用枚举成员使用WCF时的属性。

来源
Translate

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

来源
Translate

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

来源
Translate

有一些相当不错的理由不使用enum在这样的接口边界上。考虑敢的帖子就此主题而言。

来源
Translate

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

来源