Это должно работать так? - PullRequest
       10

Это должно работать так?

3 голосов
/ 30 апреля 2009

У меня есть этот код на моем сервере здесь (Да, я знаю, ASMX - плохая идея, но по какой-то причине WCF вообще не работает):

<%@ WebService Language="C#" Class="Test" %>

using System.Web;
using System.Web.Services;

[WebService(Namespace = "http://smplsite.com/smplAccess")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Test : System.Web.Services.WebService
{
    State s;

    public Test()
    {
        s = (Session["foo"] ?? (Session["foo"] = new State())) as State ;
    }

    [WebMethod(EnableSession = true)]
    public void Set(int j) { i=j; }

    [WebMethod(EnableSession = true)]
    public int Get() { return i; }
}

class State
{
    public int i = 5;
}

когда я запускаю следующий код:

class Program
{
    static void Main(string[] args)
    {
        var ser = new ServiceReference1.TestSoapClient();

        Console.WriteLine(ser.Get());
        ser.Set(3);
        Console.WriteLine(ser.Get());
    }
}

Я рассчитываю вернуться:

5
3

но я вернулся

5
5

Мое решение

  1. Используйте wsdl.exe для создания прокси-класса
  2. Добавьте ссылки, необходимые для компиляции
  3. Использование Мартина решение

Это похоже на

Редактировать: Добавлен объект состояния.

Ответы [ 3 ]

6 голосов
/ 30 апреля 2009

Веб-сервисы не имеют состояния, поэтому они не сохраняют свое состояние между несколькими вызовами. Каждый раз, когда вы вызываете метод, создается новый экземпляр службы, и его члены снова получают значения по умолчанию.

Что вы можете сделать, это включить состояние сеанса (как вы это сделали) и сохранить свое состояние в сеансе ASP.NET.

Примерно так:

[WebMethod(EnableSession = true)]
public void Set(int j) { Session["i"] = j; }

[WebMethod(EnableSession = true)]
public int Get() { return Session["i"] == null ? 5 : (int)Session["i"]; }

Это было то, что требуется на стороне сервера. Но вы также должны позаботиться о клиенте:

Поскольку сеанс ASP.NET идентифицируется с помощью файла cookie, необходимо убедиться, что вы передаете один и тот же файл cookie на сервер при каждом вызове веб-метода. Для этого вам нужно создать экземпляр CookieContainer и назначить его экземпляру прокси-сервера веб-службы:

static void Main(string[] args)
{
    var ser = new ServiceReference1.TestSoapClient();
    ser.CookieContainer = new System.Net.CookieContainer();
    // ...
}
2 голосов
/ 30 апреля 2009

Вам нужно включить сеансы.

[WebMethod(EnableSession = true)]
0 голосов
/ 30 апреля 2009

Мне кажется, что это не сохраняется состояние класса между вызовами метода сеанса - возможно, каждый раз вызывается новый объект. На самом деле я не уверен, что вы можете рассчитывать на получение одного и того же экземпляра объекта каждый раз, когда вызываете сервис. Ответ Джошуа правильный, но вам также нужно написать код, чтобы сохранить внутреннее поле службы в этом сеансе.

...