如何在Web服务中传递Dictionary

时间:2011-05-16 23:07:55

标签: .net web-services asmx

我创建了一个简单的服务来提供配置选项作为字典。我创建了一个新的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 我敢肯定我忽视了一些简单但我找不到的东西。有人能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:2)

通常,任何类型的Web服务都不了解您正在运行的平台所特有的数据类型。

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

更重要的是,ASMX Web服务无法获得类似字典的内容。如果你正在使用WCF(正如你应该为所有新开发做的那样),那么你可以在客户端上使用与服务相同的类型。

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

答案 1 :(得分:1)

约翰桑德斯是对的:这是不可能的。做你正在尝试做的事情的“正确”方法是创建一个表示你真正想要返回的键值对的类,然后返回该类的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});
    }

这直接向消费​​者提供数据:让他们决定是否要将其表示为Dictionary / Hashtable,List,Array,Tree或他们决定使用的任何其他数据结构。从数据完整性的角度来看,您所关心的只是确保每个密钥与正确的值相关联。

相关问题