【问题标题】:How to pass enumerated values to a web service如何将枚举值传递给 Web 服务
【发布时间】:2010-09-05 07:52:04
【问题描述】:

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

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

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

由于您需要在两个应用程序中对这些值进行硬编码,我认为没关系。使用描述性字符串(InvoiceContractWorkOrderSignedWorkOrder)。

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

【问题讨论】:

    标签: web-services application-integration


    【解决方案1】:

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

    它的代码有点多,而且它使大脑的静态类型部分有点生硬,但在 HTTP 之上的协议中,公认的智慧是支持易读的字符串而不是不透明的枚举。

    【讨论】:

      【解决方案2】:

      我只能说.net,但是如果你有一个 ASP.net Webservice,你应该可以直接给它添加一个枚举。

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

      但这是我的想法,我很确定我过去做过,但我不能肯定。

      【讨论】:

      • “添加 Web 引用”确实会创建枚举,但只会创建在某些方法中引用的枚举。我可以手动将枚举添加到自动生成的 Reference.cs 文件中,并且一切正常。也许这是一个单独的问题,但是有没有办法让“添加 Web 引用”在引用的程序集中添加所有枚举(但未在代码中使用)而不手动破解 Reference.cs 文件?
      • @Dave Web 服务封装了方法,因此如果没有使用枚举的方法,那么从 Web 服务的角度来看,没有必要引用它。我建议提出一个单独的问题,并说明您想要做什么/为什么要在其中使用未引用的枚举。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-02-06
                  • 2011-08-15
                  • 1970-01-01
                  • 2021-07-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多