Проблема для меня была прокси для подключения к Интернету. Код должен измениться в следующих двух местах для успешной работы:
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);
После выполнения этих изменений я смог использовать код для динамического подключения к удаленной веб-службе.
Надеюсь, что это поможет другим людям решить ту же проблему, что и я.
-1: использует технологию наследие ASMX, которая не должна быть использована для разработки новых; также, отсутствует 'using' блоков и использует' новый XmlTextReader' вместо 'XmlReader.Create'. –