2016-09-15 113 views
1

我基本上想要在通過ColdFusion調用SOAP Web服務時將ASP.NET_SessionId cookie添加到我的HTTP請求標頭中。在ColdFusion中爲SOAP調用的HTTP標頭添加cookie

Web服務在ColdFusion中的Application.cfc組件的OnApplicationStart函數中註冊。

<cfscript> 
    objSoapHeader = XmlParse("<wsse:Security mustUnderstand=""true"" xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><wsse:UsernameToken><wsse:Username>MY_USERNAME</wsse:Username><wsse:Password>MY_PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security>"); 
    Application.UserWebService = CreateObject("webservice","MY_URL/UserService.asmx?WSDL"); 
    addSOAPRequestHeader(Application.UserWebService,"","",objSoapHeader,true); 
</cfscript> 

我的Web服務被稱爲例如:

<cfset Result = "#Application.UserWebService.SomeFunction("1", "DATA")#"> 

爲了使.NET服務器(如Web服務的位置)記住我的會話狀態,我必須通過ASP.NET_SessionId的cookie中HTTP請求頭,但不知道這是否甚至可以在ColdFusion中使用。

我已經研究了好幾個小時,但是到目前爲止還沒有成功,所以有人成功設法解決這個問題?

+0

這就是你如何在cfhttp中設置cookie。 ''。但我不知道從哪裏獲取.NET值。你有沒有試過用''查看cgi範圍? – Jules

+0

爲了澄清,這裏的建議是嘗試使用'cfhttp'而不是'createObject()'來使用webservice。在某些情況下,它提供了更多的靈活性。請參閱此主題以瞭解有關如何提取Cookie並通過http請求維護會話的詳細信息:http://www.bennadel.com/blog/725-maintaining-sessions-across-multiple-coldfusion-cfhttp-requests.htm – Leigh

+0

@Leigh - 他正在尋找.NET會話ID,而不是CF。但我同意你的意見。 cookie.CFID或cookie.JSESSIONID可能更好用。 – Jules

回答

1

簡答餅乾:

對於CF9 /軸1嘗試Web服務對象實現會話。

ws = createObject("webservice", "http://localhost/MyWebService.asmx?wsdl"); 
ws.setMaintainSession(true); 

對於CF10 +/Axis2中,看到不再回答以下:


(免責聲明:使用cfhttp可能比較簡單,但我很好奇,做了一些挖掘。)

從我讀過的內容來看,由於CF10 +使用Axis2作爲Web服務,因此應該可以使用底層方法通過HTTP Cookie維護會話狀態。

使用上面的鏈接,我放在一起使用基本的Web服務的快速POC,並能夠提取的cookie來自Web服務客戶端的響應:

// make initial request 
ws = createObject("webservice", "http://localhost/MyWebService.asmx?wsdl"); 
ws.firstMethod(); 

// For maintainability, use constants instead of hard coded strings 
wsdlConstants = createObject("java", "org.apache.axis2.wsdl.WSDLConstants"); 

// Extract headers 
operation = ws._getServiceClient().getLastOperationContext(); 
context = operation.getMessageContext(wsdlConstants.MESSAGE_LABEL_IN_VALUE ); 
headers = context.getProperty(context.TRANSPORT_HEADERS); 

然後設置cookie,並指示Web服務客戶端與後續的請求發送:

if (structKeyExists(headers, "Set-Cookie")) { 
    // include http cookies with request 
    httpConstants = createObject("java", "org.apache.axis2.transport.http.HTTPConstants"); 
    options = ws._getServiceClient().getOptions(); 
    options.setManageSession(true); 
    options.setProperty(httpConstants.COOKIE_STRING, headers["Set-Cookie"]); 
} 

// ... more requests 
ws.secondMethod(); 
ws.thirdMethod(); 

NB:側面說明,我注意到您存儲在共享應用範圍的實例。請記住,Web服務實例可能不是線程安全的。

+0

非常有趣!我今天會研究這個,但是我正在運行ColdFusion 9,因此我相信我會使用Axis1 – MPaul

+0

(編輯)@MPaul - 那麼您可以使用第一個鏈接中引用的技術。我認爲它是爲Axis1編寫的。儘管CF的早期版本(7或類似的東西),所以不保證所有這些將適用於您的版本;-) – Leigh

+1

[axis1 syntax here](http://axis.8716.n7.nabble.com /Axis-1-4-client-get-cookies-td23763.html)似乎適用於CF9。出於好奇,如果啓用會話會發生什麼,例如'ws.setMaintainSession(true);'?它是否仍然失去了會議(在CF9下)? – Leigh