Webservice удаляет пространство имен из проблемы с параметром webMethod - PullRequest
1 голос
/ 01 апреля 2011

Я создал веб-метод

Услуги:

[WebMethod]    
  public void GetCommission(List <BOLibrary.Flight.DTContract>Loc)
 {
 }

На стороне клиента я передаю параметр Клиент

List<BOLibrary.Flight.DTContract> BoList = new List<BOLibrary.Flight.DTContract>();
        BOLibrary.Flight.DTContract dtConboj = new BOLibrary.Flight.DTContract();
        dtConboj.ValidatingCarrier = "AA";
        BoList.Add(dtConboj);
        BOLibrary.Flight.DTContract[] pass = BoList.ToArray();
        service.GetCommission(pass);

Но проблема в том, что service.GetCommission (pass) принимает аргумент servicenameSpace.DTContract но в клиенте в клиенте у меня есть BOLibrary.Flight.DTContract

так как я могу передать параметр в службу. Пожалуйста, посмотрите снимок сообщения об ошибке Error i am getting while passing the parameter

Ответы [ 7 ]

1 голос
/ 06 апреля 2011

Это ожидаемое поведение.Изменить его невозможно.

Если вы хотите использовать один и тот же тип на клиенте и службе, вам нужно перейти на WCF.

1 голос
/ 12 апреля 2011

Я считаю, что это ожидаемое поведение при использовании ASMX / WebMethod и веб-ссылок. То есть ожидается, что клиент и сервер будут взаимоисключающими кодами.

Если вы хотите использовать общие сущности / код библиотеки между обеими сторонами служб, вы можете использовать SvcUtil с параметром /reference, чтобы сгенерировать прокси, который будет работать с WCF и использовать определения классов из общая библиотека. довольно просто переместить ваш клиентский код из веб-ссылок (сгенерированных с помощью wsdl.exe - я думаю?) В сервисные ссылки WCF (сгенерированных с помощью svcutil.exe).

0 голосов
/ 12 апреля 2011

В вашем коде метод GetCommission ожидает список. Ваш функциональный вызов отправляет массив - не список?

0 голосов
/ 07 апреля 2011

Я думаю AutoMapper должен иметь возможность делать то, что вы хотите.

, например

using AutoMapper;

// ...

Mapper.CreateMap<BOLibrary.Flight.DTContract, FPCommission.DTContract>();
Mapper.Map<List<BOLibrary.Flight.DTContract>, FPCommission.DTContract[]>(BoList);

Обратите внимание, что вам нужно настроить сопоставление только между основными типами классов - AutoMapper позаботится о сопоставлении между коллекциями.

Вы должны попытаться поместить вызов на Mapper.CreateMap() где-нибудь в центре, где он будет вызываться только один раз, поскольку это будет дорого, если он будет вызываться часто.

0 голосов
/ 07 апреля 2011

Код клиента, сгенерированный веб-сервисом, создает свою собственную версию объекта на стороне сервера.

По определению, веб-сервис живет вне области вашего приложения и определяет объект интерфейса как таковой - без объектав клиентском домене может быть такой же, как тот, который определен службой.

Поместить иначе: веб-служба определяет весь транспортный уровень, включая любые вовлеченные транспортные объекты.Вы не можете использовать свои собственные объекты (независимо от пространства имен) в этом транспортном уровне, потому что они не известны серверу - сервер знает только те объекты, которые он определяет.

Так что в этом случае вам придетсясоздайте список объектов типа сервера, если вы хотите общаться с ним.

Как уже упоминалось, существуют другие методы связи, которые позволят вам обмениваться библиотеками между клиентом и сервером (например, WCF)если это то, что вы хотите сделать.

0 голосов
/ 05 апреля 2011

Один из способов заставить это работать - реализовать EntityTranslator, который является шаблоном, который берет объект контракта данных и «переводит» его в бизнес-объект.довольно просто, правда.Все, что вам нужно сделать, это создать два метода: один, который берет сущность контракта данных и создает из нее бизнес-сущность, а другой - берет бизнес-сущность и создает объект контракта данных.найдено здесь

0 голосов
/ 01 апреля 2011

Я не уверен, почему класс вашей веб-страницы изменяется с помощью атрибутов XmlInclude, SoapInclude & XmlRoot, потому что я думаю, что они применяются только в том случае, если вы намереваетесь сериализировать XML / soap с помощью самой веб-страницы.

Что говорит ошибка компиляции, так это то, что класс BOLibrary.Flight.DTContract не берется из пространства имен FPCommission.CommissionService в сгенерированном коде WebReference. Все ваши клиентские объекты, используемые для вызова сервиса, должны быть из пространства имен FPCommission. Если вы разделяете сборку между клиентом и службой, тогда ваш код не будет работать. Просто используйте класс FPCommission.DTContract вместо класса BOLibrary.Flight.DTContract, и ваш код должен работать.

...