0

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

有人能给我一个关于我一定做错了什么的建议吗?

提前谢谢了。

何塞·安东尼奥·阿罗巴

4

2 回答 2

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。

于 2012-06-04T22:13:03.670 回答
0

最后,我已经能够找到解决此问题的解决方法。

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

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

于 2012-06-06T16:06:09.940 回答