在WCF和Silverlight Http客户端之间共享ASP.NET会话ID

时间:2012-06-04 16:16:51

标签: asp.net wcf silverlight

我有一个配置为使用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

2 个答案:

答案 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。但它确实有效。