【问题标题】:Add cookie to HTTP header for SOAP call in ColdFusion在 ColdFusion 中将 cookie 添加到 HTTP 标头以进行 SOAP 调用
【发布时间】:2016-09-23 06:53:24
【问题描述】:

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

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>

我的网络服务是这样调用的:

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

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

我已经研究了几个小时,但目前还没有任何结果,那么有没有人成功地完成了这个?

【问题讨论】:

  • 这是在 cfhttp 中设置 cookie 的方式。 &lt;cfhttpparam type="cookie" name="NET_SessionId" value="??"&gt;。但我不知道从哪里获得 .NET 值。您是否尝试过使用 &lt;cfdump var="#cgi#"&gt; 浏览 cgi 范围?
  • 澄清一下,这里的建议是尝试使用cfhttp 而不是createObject() 来使用网络服务。在某些情况下,它提供了更大的灵活性。有关如何跨 http 请求提取 cookie 和维护会话的详细信息,请参阅此线程:bennadel.com/blog/…
  • @Leigh - 他正在寻找 .NET 会话 ID,而不是 CF。但我仍然同意你的看法。 cookie.CFID 或 cookie.JSESSIONID 可能更好用。
  • @Jules - 是的,我知道 ;-) .. 但我认为你误解了我的建议。
  • @Jules 回答您的第一条评论,我从GetHttpRequestData().Headers.Cookie 检索ASP.NET_SessionId cookie 并将其拆分为一个数组。虽然不是最理想的方法,但这允许我检索 .Net 返回的 cookie,以便识别所有后续请求的正确 SessionState 实例。

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


【解决方案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();

注意:旁注,我注意到您将实例存储在共享应用程序范围内。请记住,Web 服务实例可能不是线程安全的。

【讨论】:

  • 非常有趣!我今天会研究这个,但是我正在运行 ColdFusion 9,因此我相信我会使用 Axis1
  • (编辑)@MPaul - 那么您可以使用第一个链接中引用的技术。我认为它是为 Axis1 编写的。尽管对于早期版本的 CF(7 或类似版本),但不能保证所有这些都适用于您的版本 ;-)
  • axis1 syntax here 似乎适用于 CF9。出于好奇,如果只启用会话会发生什么,即ws.setMaintainSession( true );?它是否仍然丢失会话(在 CF9 下)?
  • 很高兴听到!对于 Axis2,仅设置 setManageSession 在早期的测试中似乎不起作用,但现在我想知道......我将不得不重新检查。
【解决方案2】:

在您的 CFHPPT 标签中,使用 CFHTTPPARAM 设置 cookie

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多