【问题标题】:How to pass a Dictionary in a web service如何在 Web 服务中传递字典
【发布时间】:2011-05-16 23:07:54
【问题描述】:

我创建了一个简单的服务来提供配置选项作为字典。我创建了一个新的 SerializableDictionary 类,该类实现了本板上描述的 IXmlSerializable。当我添加服务时(通过我的消费者项目中的“添加服务引用”),方法签名显示它返回一个 DataSet。当我在运行时检查 DataSet 时,它是空的。

这是我的服务:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class AppSettingsService : System.Web.Services.WebService
{
        [WebMethod]
        public SerializableDictionary<string, string> ReadAppSettings()
        {
            return AppSettings.Settings; // Settings is a SerializableDictionary<string, string>
        }
}

在客户端我这样做:

using Clients.AppSettingsServiceReference;

        static AppSettings()
        {
            AppSettingsServiceSoapClient client = new AppSettingsServiceSoapClient();
            var settings = client.ReadAppSettings();
            // ...
        }

我希望 settings 是一个 SerializableDictionary,但它是一个空的 DataSet。我已尝试按照此处和其他地方的建议将其作为 KeyValuePairs 列表发送,但这也返回了一个 DataSet。我正在使用 C#、ASP.Net 3.5、VS2008 Pro 我确定我忽略了一些简单的东西,但我找不到它。有人可以告诉我怎么做吗?

【问题讨论】:

    标签: .net web-services asmx


    【解决方案1】:

    一般来说,任何类型的网络服务都不理解特定于您所运行平台的数据类型。

    特别是,没有“字典”的一般概念,因此 Web 服务无法理解它们。

    更重要的是,没有办法在 ASMX Web 服务中获得像字典这样的东西。如果您使用的是 WCF(对于所有新开发都应该这样做),那么您可以在客户端上使用与服务上相同的类型。

    当然,如果您的客户端和服务没有同时运行 .NET,您仍然会遇到同样的问题。

    【讨论】:

      【解决方案2】:

      John Saunders 是对的:这实际上是不可能的。做你想做的事情的“正确”方法是创建一个代表你真正想要返回的键值对的类,然后返回该类的IEnumerable。例如:

      public class AppSetting
      {
          public string Name {get;set;}
          public string Value {get;set;}
      }
      
          [WebMethod]
          public IEnumerable<AppSetting> ReadAppSettings()
          {
              return AppSettings.Settings.Select(
                  kvp => new AppSetting{Name = kvp.Key, Value = kvp.Value});
          }
      

      这将数据直接提供给消费者:让他们决定是否要将其表示为字典/哈希表、列表、数组、树或他们决定使用的任何其他数据结构。从数据完整性的角度来看,您所关心的只是确保每个键都与正确的值相关联。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        相关资源
        最近更新 更多