如何将枚举值传递给 Web 服务
-
08-06-2019 - |
题
我的困境基本上是如何在两个应用程序之间共享枚举。
用户通过网络上的前端应用程序上传文档。该应用程序调用后端应用程序的 Web 服务并将文档传递给它。后端应用程序保存文档并在文档中插入一行 文档 桌子。
文档类型(7 种可能的文档类型: 发票, 合同 等)作为参数传递给 Web 服务的 上传文件 方法。问题是,这个参数的类型(和可能的值)应该是什么?
由于您需要在两个应用程序中对这些值进行硬编码,因此我认为这是可以的。使用描述性字符串(发票, 合同, 工作指示, 已签署的工单).
这可能是创建一个更好的方法吗? 文档类型 在第一个应用程序中进行枚举,并在第二个应用程序中重现它,然后将相应的整数值传递给它们之间的Web服务?
解决方案
我只能谈论 .net,但如果您有 ASP.net Web 服务,您应该能够直接向其添加枚举。
然后,当您在客户端应用程序中使用“添加 Web 引用”时,生成的类应包含该枚举
但这是我的想法,我很确定我过去曾经这样做过,但我不能肯定地说。
其他提示
我建议不要在它们之间传递整数,只是为了可读性和调试的目的。假设您正在查看日志,并且看到一堆 DocumentType=4 的 500 错误。现在你必须去查找哪个 DocumentType 是 4。或者,如果其中一个应用程序引用了另一个应用程序中不存在的数字,则可能是由于版本不匹配。
这是更多的代码,并且它使大脑的静态类型部分有点生硬,但在 HTTP 之上的协议中,公认的智慧是使用清晰的字符串而不是不透明的枚举。
我仍然会在内部使用枚举,但希望消费者只向我传递名称,而不是数值本身。
只是一些愚蠢的例子来说明:
public enum DocumentType
{
Invoice,
Contract,
WorkOrder,
SignedWorkOrder
}
[WebMethod]
public void UploadDocument(string type, byte[] data)
{
DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
如果您从 .NET 页面/应用程序使用 Web 服务,则在将 Web 引用添加到使用该服务的项目后,您应该能够访问该枚举。
如果您不使用 .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 -> 代理生成器工具将其解析为客户端语言中的等效枚举。
有一些相当充分的理由不使用 enum
位于这样的界面边界上。考虑 敢的帖子 就此主题而言。
我注意到,当使用 VS.net 中的“添加服务引用”而不是“添加 Web 引用”时,实际的枚举值以及枚举名称都会出现。这真的很烦人,因为我需要同时支持 2.0 和 3.5 客户端。我最终不得不进入 2.0 生成的 Web 服务代理代码,并在每次进行更改时手动添加枚举值!