доступ к одному и тому же классу через две ссылки на веб-службы в C # - PullRequest
0 голосов
/ 09 ноября 2010

Я пытаюсь создать класс C #, который может вызывать одни и те же методы для одних и тех же классов, но классы могут исходить из двух разных ссылок на веб-сервисы. Я обращаюсь к SomeWebService и SomeWebServiceAlt, где они имеют одинаковые классы, но находятся на разных серверах. Цель состоит в том, чтобы сначала попытаться использовать методы из SomeWebService, а если он выпадет, попробовать SomeWebServiceAlt. Я надеялся получить какой-то общий класс для доступа к любому веб-сервису, но у меня возникли проблемы с ограничениями типов, потому что нет никаких общих интерфейсов или базовых классов для различных классов, которые я использую из любой ссылки. То есть я использую ConnectionClass как из пространства имен SomeWebService, так и из пространства имен SomeWebServiceAlt, но два класса ConnectionClass не рассматриваются как связанные в C #, поэтому я не могу просто сказать where TClass : CommonBaseClassAcrossWebServices. Как мне это сделать? Я заканчиваю тем, что повторяю код и делаю:

if (typeof(SomeWebService.ConnectionClass) == typeof(TConnection))
{ ... }
else if (typeof(SomeWebServiceAlt.ConnectionClass) == typeof(TConnection))
{ ... }

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

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

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

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

0 голосов
/ 31 мая 2013

Я знаю, что это старо, но я продолжал возвращаться сюда.Я хотел назвать веб-сервис, который мог бы называться по-разному на стороне клиента, с другим именем сервиса и другой конечной точкой сервиса, но с тем же контрактом.Мне не нужно было динамически определять что-либо, просто позвонить с другого имени / конечной точки.Ответ здесь, но трудно понять.1. Вы должны сделать это ссылкой на службу вместо веб-ссылки, когда присоединяете ее к своему проекту.Присоедините только одну версию.
2. Во время выполнения, возможно, из настроек приложения, вы можете заменить конечную точку службы конечной точкой службы с тем же контрактом, но с другим именем.
svc2.Endpoint.Address= new System.ServiceModel.EndpointAddress (WebConfigurationManager.AppSettings ["client_service_endpoint"]. ToString ());

Это вызовет другую веб-службу в другой конечной точке независимо от имени службы.

Ура!

0 голосов
/ 09 ноября 2010

Если вы используете веб-ссылки, то вам не повезло.

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

...