我有一个配置为使用 ASP.NET 会话状态的 WCF 服务。我已经使用 WPF 客户端测试了这个 WCF 服务,并且会话状态在不同的 Web 请求中保持不变。
现在我正在尝试从使用独立于浏览器的新 Http 堆栈的 Silverlight 应用程序中使用相同的 WCF 服务。我需要使用这个堆栈才能了解我们的 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 中看不到它。
有人能给我一个关于我一定做错了什么的建议吗?
提前谢谢了。
何塞·安东尼奥·阿罗巴