我正在使用示例代码从此站点动态调用Web服务: http://www.crowsprogramming.com/archives/66
我面临的问题是,当我使用Class从Web应用程序调用Web服务时,我收到以下错误:“无法找到远程主机”并且错误发生在以下代码行: if(!ServiceDescription.CanRead(xmlreader))
但是,如果我使用Windows应用程序中的相同代码连接到Web服务: http://www.w3schools.com/webservices/tempconvert.asmx?WSDL
它工作正常。我不知道如何解决这个问题。有没有其他人面临同样的问题,并能够解决它,然后会欣赏正确方向的一些指示。
答案 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);
}
}
}
WebClient
,Stream
和XmlReader
都实现IDisposable
,因此当它们的使用仅限于本地作用域时,应在using
块中创建。此外,自{.NET 1}起,new XmlTextReader()
已被弃用,应替换为XmlReader.Create
。
(回答CW,因为它实际上只是一个格式化的评论)