【问题标题】:Possible to expose CONSTANTS defined in webservice to consuming client (.Net both sides)可以将 Web 服务中定义的 CONSTANTS 暴露给消费客户端(.Net 双方)
【发布时间】:2009-01-09 16:18:46
【问题描述】:

我为 Web 服务定义了几个常量,我希望将这些常量提供给消费客户端。服务器和客户端都是.Net。

我认为可以通过使用枚举来实现这一点,但是我的许多常量都是带有空格的文本字符串,所以我必须编写一个额外的函数来将枚举转换为等效的文本字符串。

那么,有没有办法在 Web 服务中定义常量,以便客户端可以使用它们??

更新 (Kev):我想通过 Web 服务本身向客户端公开它们,而不是通过单独的程序集。 更新#2 (Paige):所以如果我理解你的话,我将有一个新的 List 对象包含常量,但是客户端如何使用它呢?它看起来不像(大致): 暗淡常量为 List = mywebservice.GetConstants() dim someresult as Integer = mywebservice.somefunction(constants(3)) 除非我误解了你,否则这完全违背了定义常量的意义。

【问题讨论】:

  • 您是否需要将这些常量提供给客户端,以便客户端可以使用它们作为参数发送给您的服务?取决于是什么原因,可能会有替代解决方案。

标签: asp.net visual-studio web-services


【解决方案1】:

答案似乎是.....做不到。

【讨论】:

    【解决方案2】:

    您可以在独立程序集中实现这些常量,并从 Web 服务和客户端引用该程序集。

    【讨论】:

    • IMO,因为“违反”了问题的精神。当然我知道你可以分发一个单独的程序集,我试图通过 web 服务本身公开它们。你不知道吗?
    • 您确实说过客户端和服务器都是.NET,因此假设您可以控制客户端和服务器。因此建议。
    • 但至少你回来评论/解释了,所以我会像男人一样把它放在下巴上。 :)
    • 哈哈,好。我不认为这个问题可以按照我想要的方式解决。它可以通过枚举来完成,但不是常量。
    【解决方案3】:

    我不知道有什么方法可以公开常量本身。

    但也许你可以只实现一些总是返回相同值的函数并给它们一个特殊的命名约定?例如:

    public int FLAG_READONLY()
    {
       return 3;
    }
    

    我可能误解了你的需要。

    【讨论】:

      【解决方案4】:

      您可以将“常量”写入字典,然后使用 Web 方法返回键。

      或者,使用上面 Kev 的回答:

      类:

      public class Win32Message   {
          public const int WM_ACTIVATE =0x0006;
          public const int WM_ACTIVATEAPP = 0x001C;
          public const int WM_AFXFIRST = 0x0360;
          public const int WM_AFXLAST = 0x037F;
          public const int WM_APP = 0x8000;
          public const int WM_ASKCBFORMATNAME        = 0x030C;
      }
      

      然后在 web 服务中使用 web 方法,例如:

      [WebMethod]
      public System.Collections.Generic.List<string> GetConstants(System.Type type)
      {
          System.Collections.Generic.List<string> constants = new 
              System.Collections.Generic.List<string>();
      
          System.Reflection.FieldInfo[] fieldInfos = type.GetFields(
              System.Reflection.BindingFlags.Public | BindingFlags.Static |
              System.Reflection.BindingFlags.FlattenHierarchy);
      
          // Go through the list and only pick out the constants
          foreach (System.Reflection.FieldInfo fi in fieldInfos)
          if (fi.IsLiteral && !fi.IsInitOnly)
              constants.Add(fi.Name);
      
          return constants;
      }
      

      我在Wes' Puzzling Blog找到了这个

      当然,您可以将其作为数组、arraylist 或任何您喜欢的方式返回。

      【讨论】:

      • Linky to Wes 的文章已损坏...在他的网站上查看过,但找不到。
      • 所以如果我理解你的话,我将有一个新的 List 对象包含常量,但是客户端如何使用它呢?看起来不是(大致):dim constants as List = mywebservice.GetConstants() dim someresult as Integer = mywebservice.somefunction(constants(3)) 不是很有用。
      【解决方案5】:

      在我看来,Web 服务的真正意义在于能够以独立于语言和机器的方式在服务器上检索数据或执行进程,使用 xml 或 json 或其他任何语言作为数据表示的语言。当您调用服务列出产品时,您只想获取产品,您不想(或不需要)知道您是在调用存储的 SQL 过程还是服务器中的 C# 业务函数。所以我认为从客户端共享“常量”到服务器是没有意义的,除非您有一个向您列出这些常量的 Web 方法(同样,以纯文本方式)。 我认为整个 Microsoft Web 服务 .asmx 堆栈很糟糕,因为它依赖于“远程过程调用”隐喻,而不是 Web 服务概念的“服务”部分。

      我同意这是主观的:P

      【讨论】:

      • 您对依赖 RPC 的 ASMX 堆栈是错误的。它可以很好地处理“文档”样式的 Web 服务。
      猜你喜欢
      • 2011-02-07
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多