2010-08-27 5 views
2

Я использую пример кода для динамического вызова веб-службы с этого сайта: http://www.crowsprogramming.com/archives/66Динамически Invoke Web Service Во время выполнения

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

Но если я использую (ServiceDescription.CanRead (XmlReader)!) тот же код из приложения Windows для подключения к сети сервис: http://www.w3schools.com/webservices/tempconvert.asmx?WSDL

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

ответ

0

Проблема для меня была прокси для подключения к Интернету. Код должен измениться в следующих двух местах для успешной работы:

1] метод BuildServiceDescriptionImporter (XmlTextReader XMLReader) было изменено на

private ServiceDescriptionImporter BuildServiceDescriptionImporter(string webserviceUri) 
    { 
     ServiceDescriptionImporter descriptionImporter = null; 

     **WebClient client = new WebClient { Proxy = new WebProxy(string host, int port) };** 

     Stream stream = client.OpenRead(webserviceUri); 

     XmlTextReader xmlreader = new XmlTextReader(stream); 

     // parse wsdl 
     ServiceDescription serviceDescription = ServiceDescription.Read(xmlreader); 

     // build an importer, that assumes the SOAP protocol, client binding, and generates properties 
     descriptionImporter = new ServiceDescriptionImporter(); 
     descriptionImporter.ProtocolName = "Soap12"; 
     descriptionImporter.AddServiceDescription(serviceDescription, null, null); 
     descriptionImporter.Style = ServiceDescriptionImportStyle.Client; 
     descriptionImporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties; 

     return descriptionImporter; 
    } 

2] второй кусок кода, который должен был быть изменен был в пределах метода public T InvokeMethod<T>(string serviceName, string methodName, params object[] args)

добавить следующий фрагмент кода перед вызовом метода:

PropertyInfo Proxy = type.GetProperty("Proxy"); 

WebProxy webProxy = new WebProxy(string host, int port); 

Proxy.SetValue(serviceInstance, webProxy, null); 

После выполнения этих изменений я смог использовать код для динамического подключения к удаленной веб-службе.

Надеюсь, что это поможет другим людям решить ту же проблему, что и я.

+0

-1: использует технологию наследие ASMX, которая не должна быть использована для разработки новых; также, отсутствует 'using' блоков и использует' новый XmlTextReader' вместо 'XmlReader.Create'. –

0

Код выше требуется немного больше:

ServiceDescription serviceDescription; 
using (WebClient client = new WebClient {Proxy = new WebProxy(host, port)}) 
{ 
    using (Stream stream = client.OpenRead(webserviceUri)) 
    { 
     using (XmlReader xmlreader = XmlReader.Create(stream)) 
     { 
      serviceDescription = ServiceDescription.Read(xmlreader); 
     } 
    } 
} 

WebClient, Stream и XmlReader все реализовать IDisposable, поэтому должны быть созданы в using блоке, когда их использование только локальную область действия. Кроме того, new XmlTextReader() устарел с .NET 2.0 и должен быть заменен на XmlReader.Create.

(ответ сделал CW, потому что это на самом деле просто отформатированный комментарий)