我有一个配置为使用ASP.NET会话状态的WCF服务。我已经使用WPF客户端测试了此WCF服务,并且在不同的Web请求中维护了会话状态。
现在我正在尝试从Silverlight应用程序中使用这个相同的WCF服务,该应用程序使用独立于浏览器的新Http堆栈。我需要使用此堆栈才能理解我们的WCF服务故障。我的问题是,在这种情况下,我们无法从响应中读取带有ASP.NET_SessionId cookie的Set-Cookie标头,或者在请求中设置Cookie标头。
这是Silverligth应用程序的绑定:
<customBinding>
<binding name="customHttpBinding_IBasoaWebService" sendTimeout="01:00:00">
<binaryMessageEncoding />
<httpCookieContainer />
<httpTransport maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />
</binding>
</customBinding>
这是WCF服务的绑定:
<basicHttpBinding>
<binding name="basicHTTP" closeTimeout="01:00:00" openTimeout="01:00:00"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="None" />
</binding>
</basicHttpBinding>
在Silverlight应用程序中,我们使用此代码读取响应中的Set-Cookie标头:
IHttpCookieContainerManager cookieManager = channel.GetProperty<IHttpCookieContainerManager>();
if (cookieManager.CookieContainer == null)
cookieManager.CookieContainer = new CookieContainer();
Uri applicationUri = new Uri(Application.Current.Host.Source, "../");
string cookieString = cookieManager.CookieContainer.GetCookieHeader(applicationUri);
ParseCookieString(cookieString);
这是在请求中设置ASP.NET会话ID cookie的代码:
IHttpCookieContainerManager cookieManager = channel.GetProperty<IHttpCookieContainerManager>();
if (cookieManager.CookieContainer == null)
cookieManager.CookieContainer = new CookieContainer();
Uri applicationUri = new Uri(Application.Current.Host.Source, "../");
Cookie cookie = new Cookie("ASP.NET_SessionId", aspNetSessionId);
cookieManager.CookieContainer.Add(applicationUri, cookie);
通过Fiddler检查交换的消息我看到WCF服务在第一个响应中正确发送了Set-Cookie标头,但Silverlight无法读取它。我还尝试通过CookieContainer类在请求中设置Cookie标头,但没有运气。我在Fiddler看不到它。
有人可以给我一些关于我一定做错的建议吗?
非常感谢提前。
Jose Antonio Arroba答案 0 :(得分:1)
在Web应用程序中,我使用URI来设置SessionID。 (我认为可以使用WCF服务)
在服务的web.config中,定义:
<system.web>
<sessionState cookieless="true"></sessionState>
</system.web>
或
<sessionState cookieless="UseUri"></sessionState>
sessionId适用于:
http://localhost:51358/(S(1wnqb23d2qe4blfxzukligdo))/default.aspx
您可以在URI中获取并设置SessionID。
答案 1 :(得分:0)
最后,我找到了解决此问题的解决方法。
Cookie
标头未与请求一起发送的原因是我在Cookie
对象中设置了一个错误的Uri。如果我尝试连接到http://localhost:8080/Service
,则提供的正确Uri
值似乎是http://localhost:8080
而不是http://localhost:8080/Service
。
但是我仍然想知道如何阅读服务器发送的Set-Cookie
。我的解决方法包括在自定义SOAP标头中发送ASP.NET会话ID并在客户端中读取它,这是相当多余的IMHO。但它确实有效。