在运行时动态调用Web服务

时间:2010-08-27 05:04:48

标签: c# .net web-services dynamic asmx

我正在使用示例代码从此站点动态调用Web服务: http://www.crowsprogramming.com/archives/66

我面临的问题是,当我使用Class从Web应用程序调用Web服务时,我收到以下错误:“无法找到远程主机”并且错误发生在以下代码行: if(!ServiceDescription.CanRead(xmlreader))

但是,如果我使用Windows应用程序中的相同代码连接到Web服务: http://www.w3schools.com/webservices/tempconvert.asmx?WSDL

它工作正常。我不知道如何解决这个问题。有没有其他人面临同样的问题,并能够解决它,然后会欣赏正确方向的一些指示。

2 个答案:

答案 0 :(得分: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 );

执行这些更改后,我可以使用代码动态连接到远程Web服务。

希望这有助于其他人面对与我相同的问题。

答案 1 :(得分: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);
        }
    }
}

WebClientStreamXmlReader都实现IDisposable,因此当它们的使用仅限于本地作用域时,应在using块中创建。此外,自{.NET 1}起,new XmlTextReader()已被弃用,应替换为XmlReader.Create

(回答CW,因为它实际上只是一个格式化的评论)