Это должно работать таким образом?
-
03-07-2019 - |
Вопрос
У меня есть этот код на моем сервере здесь (Да, я знаю, что 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
Мое решение
- Ты видишь
wsdl.exe
для создания прокси-класса - Добавьте ссылки, необходимые для компиляции.
- Использовать Мартина решение
Редактировать:Добавлен объект State.
Решение
Веб-сервисы не сохраняют состояние, поэтому они не сохраняют свое состояние между несколькими вызовами.Каждый раз, когда вы вызываете метод, будет создан новый экземпляр службы, и его члены снова будут иметь значения по умолчанию.
Что вы можете сделать, так это включить состояние сеанса (как вы это сделали) и сохранить свое состояние в сеансе 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();
// ...
}
Другие советы
Вам необходимо включить сеансы.
[WebMethod(EnableSession = true)]
Мне кажется, что состояние класса не сохраняется между вызовами методов сеанса - вероятно, каждый раз вызывается новый объект.На самом деле я не уверен, что вы можете рассчитывать на получение одного и того же экземпляра объекта каждый раз, когда вызываете службу.Ответ Джошуа правильный, но вам также нужно будет написать код, чтобы сохранить внутреннее поле вашего сервиса в этом сеансе.