Как передать словарь в веб-сервис - PullRequest
1 голос
/ 17 мая 2011

Я создал простой сервис для предоставления опций конфигурации в качестве словаря.Я создал новый класс 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();
            // ...
        }

Я ожидаю настройки быть SerializableDictionary, но это пустой DataSet.Я попытался отправить его в виде списка KeyValuePairs, как предлагается здесь и в других местах, но он также возвращает DataSet.Я использую C #, ASP.Net 3.5, VS2008 Pro. Я уверен, что пропускаю что-то простое, но не могу найти его.Может кто-нибудь показать мне, как это сделать?

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

Как правило, веб-службы любого типа не понимают типы данных, характерные для платформы, на которой вы работаете.

В частности, нет общего понятия "словарь", поэтому веб-службы не используютне понимаю их.

Более того, нет способа получить что-либо похожее на словарь через веб-сервисы ASMX.Если бы вы использовали WCF (как вы должны делать для всех новых разработок), то вы могли бы использовать те же типы на клиенте, что и на службе.

Конечно, у вас все равно будет та же проблема, есливаш клиент и служба не работают под управлением .NET.

1 голос
/ 17 мая 2011

Джон Сондерс прав: на самом деле это невозможно.«Правильный» способ сделать то, что вы пытаетесь сделать, - это создать класс, который представляет пары ключ-значение, которые вы действительно пытаетесь вернуть, и затем вернуть 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});
    }

Это предоставляет данные непосредственно потребителю: пусть они решают, хотят ли они представлять их в виде словаря / хэш-таблицы, списка, массива, дерева или любой другой структуры данных, которую они решилисделать из этого.С точки зрения целостности данных все, что вам нужно, - это убедиться, что каждый ключ связан с правильным значением.

...