Я пытаюсь написать приложение на C #, которое является клиентом Webservice, которое вызывает Web-сервис Java (используя Axis 1.4), но я не могу заставить его работать.Java WS требует настраиваемого заголовка SOAP для аутентификации, поэтому я добавил его в свое приложение C #.Код, сгенерированный в VS 2010, не содержит заголовок SOAP, поэтому я добавил в проект класс MySOAPHeader
:
namespace AddProvinceCityDemo
{
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://service.itthrm.vnitt.org")]
[System.Xml.Serialization.XmlRootAttribute("securitytoken", Namespace = "http://service.itthrm.vnitt.org", IsNullable = false)]
public class MySOAPHeader:SoapHeader
{
public String username;
public String password;
}
}
Я также изменил сгенерированный код в Reference.cs, добавив MySOAPHeader
variable
public partial class ProvinceServiceClient : System.ServiceModel.ClientBase<AddProvinceCityDemo.ProvinceService.ProvinceService>, AddProvinceCityDemo.ProvinceService.ProvinceService {
public MySOAPHeader customSOAPHeader;
public ProvinceServiceClient() {
}
//.........................
}
Наконец, я вызвал WS со следующим кодом:
MySOAPHeader authentication = new MySOAPHeader();
authentication.username = username;
authentication.password = encryptedpass;
//end set SOAP header information
ProvinceServiceClient provinceservice = new ProvinceServiceClient();
provinceservice.customSOAPHeader = authentication;
Province[] arrprovince = null;
arrprovince = provinceservice.findAll();
Но в итоге выдается ошибка: "Failed to retrieve the SOAP header"
.
Это былолегко написать Java-версию кода:
SOAPHeaderElement oHeaderElement;
oHeaderElement = new SOAPHeaderElement(namespace, "securityHeader");
oHeaderElement.setPrefix"sec");
oHeaderElement.setMustUnderstand(false);
oElement = oHeaderElement.addChildElement("username");
oElement.addTextNode(username);
oElement = oHeaderElement.addChildElement("password");
oElement.addTextNode(passwordEncrypt);
Как я могу сделать то же самое в .NET и C #?