【问题标题】:Share ASP.NET Session Id between WCF and a Silverlight Http client在 WCF 和 Silverlight Http 客户端之间共享 ASP.NET 会话 ID
【发布时间】:2012-06-04 16:16:51
【问题描述】:

我有一个配置为使用 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 中看不到。

有人可以就我做错的地方给我一个建议吗?

非常感谢。

何塞·安东尼奥·阿罗巴

【问题讨论】:

    标签: asp.net wcf silverlight


    【解决方案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。

    【讨论】:

    • 谢谢@Hyralex。您的建议帮助我思考发送 ASP.NET 会话 ID 的不同方式。最后,我决定通过自定义 SOAP 标头发送它。我不太确定 cookieless 模式是否可以与 WCF 和 Silverlight 一起使用
    【解决方案2】:

    我终于找到了解决这个问题的方法。

    Cookie 标头未随请求一起发送的原因是我在 Cookie 对象中设置了错误的 Uri。如果我尝试连接到http://localhost:8080/Service,那么提供的正确Uri 值似乎是http://localhost:8080 而不是http://localhost:8080/Service

    但是我仍然想知道如何读取服务器发送的Set-Cookie。我的解决方法包括在自定义 SOAP 标头中发送 ASP.NET 会话 ID 并在客户端中读取它,恕我直言,这是相当多余的。但它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 2016-12-26
      • 2011-08-26
      • 2010-10-08
      • 1970-01-01
      • 2011-01-30
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多