Как добавить собственный заголовок SOAP для клиента веб-службы C #, вызвать веб-службу Axis 1.4 - PullRequest
3 голосов
/ 17 августа 2011

Я пытаюсь написать приложение на 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 #?

...