2009-09-22 83 views
1

我正在嘗試使用流量Web服務。下面給出了SOAP請求的一個例子。使用c#/ ASP.NET添加自定義SOAP標頭

我在c#中使用WSDL結構中的Wsdl.exe創建了一個代理類。

我想我現在需要以某種方式將「authenticate」SOAP頭插入到 方法調用的SOAP結構中。我不確定如何將標題添加到服務方法調用?

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="http://www.inteleacst.com.au/wsdl" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Header> 
    <ns1:authenticate> 
     <SOAP-ENC:Struct> 
     <username>username</username> 
     <password>password</password> 
     </SOAP-ENC:Struct> 
    </ns1:authenticate> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
    <ns1:getAllTraffic> 
     <States SOAP-ENC:arrayType="xsd:string[3]" xsi:type="ns1:State_Arr"> 
     <item xsi:type="xsd:string">VIC</item> 
     <item xsi:type="xsd:string">NSW</item> 
     <item xsi:type="xsd:string">NT</item> 
     </States> 
     <EventCodes SOAP-ENC:arrayType="xsd:int[1]" xsi:type="ns1:EventCode_arr"> 
     <item xsi:type="xsd:int">802</item> 
     </EventCodes> 
    </ns1:getAllTraffic> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

這是調用Web服務方法的代理類中的代碼。

[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://webservice.intelecast.com.au/traffic/PublicSoap/server.php#getAllTraffic", RequestNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php", ResponseNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php")] 
     [return: System.Xml.Serialization.SoapElementAttribute("return")] 
     public TrafficInfo[] getAllTraffic(string[] States, int[] EventCodes) { 
      object[] results = this.Invoke("getAllTraffic", new object[] { 
         States, 
         EventCodes}); 
      return ((TrafficInfo[])(results[0])); 
     } 

回答

4

在網上搜索我找到了一個關於非常類似的問題和一個很好的解決方案的論壇帖子。 可在這裏 - forums.asp.net/t/1137408.aspx

2

添加SOAP頭是其中的一件事情,進行了與WCF更令人費解相比之前在Visual Studio .NET 2003/2005「添加Web服務引用」和創建SOAP擴展。

要在WCF中做到這一點,您需要添加一個EndPointBehavior。有很多例子,google on IEndpointBehavior和IClientMessageInspector。這article提供了一個很好的簡潔的例子,但你可能需要擴大它。

+0

我沒有使用WCF。 – 2009-09-22 07:13:35

+1

您應該使用SoapExtension http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension(VS.71).aspx。 – sipwiz 2009-09-22 08:05:00

+0

謝謝,我已經成功地使用SoapExtension來解決標題問題。 – 2009-09-23 02:24:49