在ColdFusion

时间:2016-09-15 21:20:07

标签: web-services cookies coldfusion httprequest coldfusion-9

当我通过ColdFusion调用SOAP Web服务时,我基本上想要将ASP.NET_SessionId cookie添加到我的HTTP请求标头中。

Web服务已在ColdFusion中OnApplicationStart组件的Application.cfc函数中注册。

<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>

我的网络服务被称为:

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

为了使.Net服务器(Web服务所在的位置)能够记住我的会话状态,我必须在HTTP请求标头中传递ASP.NET_SessionId cookie,但不知道这是否可能在的ColdFusion。

我已经研究了好几个小时但是到目前为止还没有任何结果,所以有没有人成功地将其拉下来了?

2 个答案:

答案 0 :(得分:1)

简答:

对于CF9 / Axis1,尝试在Web服务对象上启用会话。

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

对于CF10 + / Axis2,请参阅下面的更长答案:

(免责声明:使用cfhttp可能更简单,但我很好奇并且做了一些挖掘......)

根据我的阅读,由于CF10 +使用Axis2进行Web服务,因此应该可以使用底层方法通过HTTP cookie维护会话状态。

使用上面的链接,我使用基本Web服务组合了一个快速POC,并且能够从Web服务客户端响应中提取cookie头:

// 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服务实例可能不是线程安全的。

答案 1 :(得分:0)

在CFHPPT标记内,使用CFHTTPPARAM

设置Cookie