将会话数据保存在System.Web.Services.WebService的WebMethod中

时间:2012-08-14 15:03:45

标签: asp.net web-services session webmethod

我正在使用VS2010,asp.net c#。

我有一个像这样声明的WebMethod

      [WebMethod(EnableSession = true)]
        public String getErrorMsg()
        {           
if (HttpContext.Current.Session["error"] == null) return "empty";
else return ((String)(HttpContext.Current.Session["error"]));
        }

在System.Web.Services.WebService类内部(继承)。

在另一个WebMethod中,我设置了这个消息,让我们假设它就像这个

   [WebMethod(EnableSession = true)]
            public void firstMethod()
            {           
    HttpContext.Current.Session["error"] ="bla";
}

在另一个项目中,我为此WebService添加了一个Service Refrence。 然后我尝试使用它:

    WebService1.WebService1SoapClient MyService=
    new WebService1.WebService1SoapClient();
        MyService.firstMethod(); // this calls the method that sets
 //the "bla" string in the session
    String str=MyService.getErrorMsg();
    System.Diagnostics.Debug.WriteLine("Message "+str);

Str是“空的”;

在第一种方法中,“bla”字符串设置为会话。只要我在这个方法中,我就可以使用会话存储的数据。 当我再次调用WebService时,先前的会话数据不再存在。

我到处寻找。我发现只有这个例子:

 // instantiate the proxy 
    localhost.MyDemo MyService = new localhost.MyDemo();

    // create a container for the SessionID cookie
    MyService.CookieContainer = new CookieContainer();

    // call the Web Service function
    Label1.Text += MyService.HelloWorld() + "<br />";

但有两个主要问题:

1)我的WebService不能用作对象,这意味着我不能在该类上使用“new”,就像这个例子一样。

我使用WebService1SoapClient来使用WebService。

2)WebService1SoapClient对象中没有CookieContainer这样的东西。

我认为这个示例必须在旧的vs / .net版本中使用。

有谁知道如何在网络服务中保存会话数据?

2 个答案:

答案 0 :(得分:0)

我似乎找到了答案。 在web.config中你有一个

     <system.serviceModel>
            <bindings>
              <basicHttpBinding>
 <binding name="NameOfWebServiceSoap"/>
         </basicHttpBinding>
            </bindings>
           <client>
              <endpoint address="*AddressOfWebService*" binding="basicHttpBinding" bindingConfiguration="*NameOfWebServiceSoap*" 
    contract="*NameOfWebService.NameOfWebServiceSoap*" name="*NameOfServiceReference*"/>
            </client>
          </system.serviceModel>

在绑定名称下添加以下内容:

allowCookies="true"

所以它看起来像这样:

<binding name="NameOfWebServiceSoap" allowCookies="true"/>

答案 1 :(得分:-1)

我不得不认为你错了两个原因

  1. 您在网络服务代理类

    上使用 new
      

    WebService1.WebService1SoapClient MyService =        WebService1.WebService1SoapClient();

  2. 您使用visual studio创建的任何Web服务代理都继承自实现CookieContainer()的System.Web.Services.Protocols.HttpWebClientProtocol