自定义SoapHeader php到c#


custom SoapHeader php to C#

如何在c#中使用servicerreference或webrereference

   class SoapAuthentificationHeader {
        /** @var string sPassword */
        public $Password;
        /** @var string sLogin */
        public $sLogin;
        /** @var string anotherCustomParam*/
        public $sVod;
        public function __construct($sLogin, $sPassword, $sVod) {
            $this->sPassword=$sPassword;
            $this->sLogin=$sLogin;
            $this->sVod=$sVod;
        }
    }
    $oSoap=new SoapClient('http://.[ my path ]...wsdl', array(
        'trace' => 1,
        'encoding' => 'UTF-8'
    ));
    try {
        $oSoap->__setSoapHeaders(array(new SoapHeader('urn:vod_soap', 'AuthenticationHeader', new SoapAuthentificationHeader('login', 'password', 'anotherCustomParam'))));     
$iCountVideo = $oSoap->countVideo();
    } catch (Exception $oException) {
        var_dump($oException);
    }

我尝试在调用之间实例化一个共享CookieContainer。但它没有工作:目前我有:

vod_soapService s = new vod_soapService();
            s.CookieContainer = new CookieContainer();
            s.ConnectionGroupName = "test";
             // this webmethod works it return me true 
            s.AuthenticationHeader("foo", "bar", "test");
            string test = s.countVideo();

您必须在发送xml之前手动插入soap头。要做到这一点,请阅读下面的链接
http://forums.asp.net/t/1137408.aspx

您还必须调整给定的解决方案以适合您的身份验证头

你的"AfterSerialize"实现应该是这样的:

case SoapMessageStage.AfterSerialize:
{
  // Get the SOAP body as a string, so we can manipulate...
  String soapBodyString = getXMLFromCache();
  String BodyString = "<soap:Body";
  int posStartBody = soapBodyString.IndexOf(BodyString);
  // Create the SOAP header Message 
  String soapEnvHeaderString = "<soap:Header><SoapAuthentificationHeader><sLogin>";
  String soapEnvHeaderString2 = "</sLogin><sPassword>";
  String soapEnvHeaderString3 = "</sPassword><sVod>";
  String soapEnvHeaderString4 = "</sVod></SoapAuthentificationHeader></soap:Header>";
  Stream appOutputStream = new MemoryStream();
  StreamWriter soapMessageWriter = new StreamWriter(appOutputStream);
  soapMessageWriter.Write(soapBodyString.Substring(0,posStartBody));
  soapMessageWriter.Write(soapEnvHeaderString);
  soapMessageWriter.Write("your login ");
  soapMessageWriter.Write(soapEnvHeaderString2);
  soapMessageWriter.Write("your password");
  soapMessageWriter.Write(soapEnvHeaderString3);
  soapMessageWriter.Write("your vod");
  soapMessageWriter.Write(soapEnvHeaderString4);
  soapMessageWriter.Write(soapBodyString.Substring(posStartBody));
  // write it all out.
  soapMessageWriter.Flush();
  appOutputStream.Flush();
  appOutputStream.Position = 0;
  StreamReader reader = new StreamReader(appOutputStream);
  StreamWriter writer = new StreamWriter(this.outputStream);
  writer.Write(reader.ReadToEnd());
  writer.Flush();
  appOutputStream.Close();
  this.outgoing = false;
  this.incoming = true;
  break;
}