ColdFusion和.Net会话

时间:2016-09-15 15:14:27

标签: .net web-services soap coldfusion ws-security

Web应用程序通常具有客户端和服务器端,而在我的特定场景中,我们使用客户端和两种服务器端技术,使用Web服务来执行操作和发出请求。

虽然与底层问题无关,但这种设置的原因仅仅是因为我们的基于桌面的应用程序使用.Net,而我们的Web应用程序使用ColdFusion,我们一直在慢慢转换服务器进程到.Net,使用Web服务作为执行这些操作的手段,从而无疑在不久的将来更容易切换到完整的.Net解决方案。

问题

问题是当我调用.Net Web服务从ColdFusion时,.Net似乎不会保留超出HTTP请求的会话。

但是,如果我使用带有jQuery的Ajax调用相同的Web服务,则会话将保留在单个HTTP请求之外。 (在我的所有页面中)

Web服务已在Cold Fusion中OnApplicationStart组件的Application.cfc功能中注册。 (注意:SoapHeader实现 ws-security

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

从jQuery调用相同的Web服务时,标题和正文的结构如下:

var strSoapData = "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Header><LanguageHeader xmlns='http://tempuri.org/'><Locale>en-CA</Locale></LanguageHeader></soap:Header><soap:Body>" + strData + "</soap:Body></soap:Envelope>";

为了处理.Net中的ws-security,以下代码放在web.config文件中:

<webServices>
    <soapExtensionImporterTypes>
        <add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </soapExtensionImporterTypes>
    <soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</webServices>

问题

经过数小时的研究和反复试验,我甚至可以采取下一步措施,以确定在从Cold Fusion调用Web服务时,为什么我的会话在.Net中丢失的根本问题?

修改

经过一番研究后,我相信Cold Fusion并没有保留ASP.NET_SessionId cookie,也许还有cookie。我将尝试一种无cookie的方法,并根据我的发现进行更新。

1 个答案:

答案 0 :(得分:0)

解决方案就像在Web服务上启用cookie一样简单。

Application.UserWebService.setMaintainSession(true);