Session.SessionId对ashx的请求持久化

时间:2012-07-13 19:02:18

标签: c# asp.net web-services ashx

当我对服务进行webrequest调用时,为什么它总是生成一个新的sessionid?

这就是我从sitea.com打电话的方式

WebClient fs = new WebClient();
            var data = fs.DownloadData("http://siteb.com/serice.ashx");
            var tostring = System.Text.Encoding.ASCII.GetString(data);
            return tostring;

这是siteb.com上的服务代码

[WebMethod(EnableSession = true)]
    private string Read(HttpContext context)
    {
        var value = context.Session.SessionId;
        if (value !=null) return value.ToString();
            return "false";
    }

每个请求的值总是不同的。我怎么能坚持这个?

2 个答案:

答案 0 :(得分:3)

您必须接收会话ID并将其传递给后续请求。默认情况下,它将在cookie中发送,但WebClient不处理cookie。您可以使用CookieAwareWebClient来解决此问题:

public class CookieAwareWebClient : WebClient
{
    private CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = m_container;
        }
        return request;
    }
}

只要您重复使用相同的Web客户端实例,就应该获得相同的会话ID(如果会话不会超时)。

答案 1 :(得分:2)

来自MSDN: XML Web服务客户端由XML Web服务返回的HTTP cookie唯一标识。为了使XML Web服务维护客户端的会话状态,客户端必须保留cookie。客户端可以通过创建CookieContainer的新实例并在调用XML Web服务方法之前将其分配给代理类的CookieContainer属性来接收HTTP cookie。如果您需要在代理类实例超出范围之外维护会话状态,则客户端必须在对XML Web服务的调用之间保留HTTP cookie。例如,Web窗体客户端可以通过将CookieContainer保存在其自己的会话状态来持久保存HTTP cookie。由于并非所有XML Web服务都使用会话状态,因此客户端并不总是需要使用客户端代理的CookieContainer属性,因此XML Web服务的文档应说明是否使用了会话状态。

以下代码示例是使用会话状态的XML Web服务的Web窗体客户端。客户端通过将其存储在客户端的会话状态中来持久保存唯一标识会话的HTTP cookie。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>

<html>

<script runat="server">

    void EnterBtn_Click(Object Src, EventArgs E) 
{
  // Create a new instance of a proxy class for your XML Web service.
  ServerUsage su = new ServerUsage();
      CookieContainer cookieJar;

  // Check to see if the cookies have already been saved for this session.
  if (Session["CookieJar"] == null) 
    cookieJar= new CookieContainer();
      else
   cookieJar = (CookieContainer) Session["CookieJar"];

    // Assign the CookieContainer to the proxy class.
    su.CookieContainer = cookieJar;

  // Invoke an XML Web service method that uses session state and thus cookies.
  int count = su.PerSessionServiceUsage();         

  // Store the cookies received in the session state for future retrieval by this session.
  Session["CookieJar"] = cookieJar;

      // Populate the text box with the results from the call to the XML Web service method.
      SessionCount.Text = count.ToString();  
    }

</script>
<body>
   <form runat=server ID="Form1">

         Click to bump up the Session Counter.
         <p>
         <asp:button text="Bump Up Counter" Onclick="EnterBtn_Click" runat=server ID="Button1" NAME="Button1"/>
         <p>
         <asp:label id="SessionCount"  runat=server/>

   </form>
  </body>
  </html>

阅读MSDN上的完整详情http://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute.enablesession.aspx