Передача коллекции через asmx - PullRequest
0 голосов
/ 10 августа 2010

У меня есть список пар (CarType (Enum), код (строка)).К сожалению, в этой коллекции коды не уникальны.

Van,C1
Van,C2
Pickup,C1

Как передать эту коллекцию через asmx webservice.

Теперь у меня есть KeyValuePair [] в качестве параметра в webMethod

[webmethod]
public void DestroyCars(KeyValuePair<string, CarType>[] cars)
{
//implementation.
}

Но когда я обновляю свою веб-ссылку (не servicereference) и помещаю экземпляр KeyValuePair [] в

service.DestroyCars(someinstance of KeyValuePair<string, CarType>[])

, я получаю исключение, потому что я должен там KeyPairValuOfStringCarType.

Почему это так и какисправить это?

Чтобы быть более понятным:

Я хочу передать многомерную коллекцию через веб-сервис.

Я создаю

[webmethod] public void DestroyCars(KeyValuePair [] cars) {// реализация.}

Я обновляю веб-ссылку моего приложения.

Когда я хочу вызвать этот веб-метод из моего приложения с новым экземпляром KeyValuePair [], я получаю сообщение об ошибке, что этот параметр не может быть назначен типу параметрамой веб-метод.

Intellisense сообщает мне, что тип этого параметра - KeyPairValuOfStringCarType с не является истиной.

Я проверяю тип этого типа в net.reflector и вижу, что это строка.

Я знаю, что нет никакого смысла.Вот как я прошу помощи: /

1 Ответ

4 голосов
/ 10 августа 2010

Причина возникновения этой ошибки:

"тип параметра" System.Collections.Generic.KeyValuePair [] "нельзя назначить типу параметра mywebservicenamespace.KeyPairValuOfStringCarType

Это потому, что когда asp.net создает для вас прокси веб-службы (ссылку на веб-службу), он «дублирует» любые пользовательские типы, предоставляемые вашей веб-службой, в этом случае KeyValuePair<string, CarType> преобразуется в KeyValuePairOfStringCarType в прокси, чтобы вы могли передать их в веб-сервис.

Что вам нужно сделать, чтобы позвонить в ваш веб-сервис (это работало для меня, в Visual Studio 2008, для веб-службы asmx):

// Create a new CarKeyValuePair in your web service project
public struct CarKeyValuePair
{
    public string Key { get; set; }
    public CarType CarType { get; set; }
}

// Change your web method to use this instead of KeyValuePair
[WebMethod]
public void DestroyCars(CarKeyValuePair[] cars)
{
    // Implementation here
}

Затем вы можете обновить ссылку на ваш веб-сервис и написать нечто похожее на следующее в коде, который вызывает ваш веб-сервис:

service.DestroyCars(new CarKeyValuePair[] { new CarKeyValuePair() { CarType = CarType.Pickup, Key = "C1" } });

// or

var cars = new List<CarKeyValuePair>();
var car = new CarKeyValuePair();
car.CarType = CarType.Pickup;
car.Key = "C1";
cars.Add(car);
service.DestroyCars(cars.ToArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...