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的方法,并根据我的发现进行更新。
答案 0 :(得分:0)
解决方案就像在Web服务上启用cookie一样简单。
Application.UserWebService.setMaintainSession(true);