Веб-сервисы не имеют состояния, поэтому они не сохраняют свое состояние между несколькими вызовами. Каждый раз, когда вы вызываете метод, создается новый экземпляр службы, и его члены снова получают значения по умолчанию.
Что вы можете сделать, это включить состояние сеанса (как вы это сделали) и сохранить свое состояние в сеансе 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();
// ...
}