Динамически вызывать веб-сервис во время выполнения - PullRequest
2 голосов
/ 27 августа 2010

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

Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую класс для вызова веб-службы из веб-приложения, я получаю следующую ошибку: " Не удается найти удаленный хост ", и ошибка возникает на следующая строка кода: if (! ServiceDescription.CanRead (xmlreader))

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

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

Ответы [ 2 ]

0 голосов
/ 30 августа 2010

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

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, потому что это действительно просто отформатированный комментарий)

0 голосов
/ 30 августа 2010

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

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 );

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

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

...