Как создать XML-WebService с сохранением состояния в asp.net?

Не вдаваясь в дискуссию "Службы с отслеживанием состояния - это плохо"... Как вы их создаете?

Из-за отсутствия полезных результатов поиска... кажется, что я ищу неправильные термины, или это активно не поощряется. Лучшая ссылка, которую я смог найти, была на MSDN.

Чтобы дать краткий контекст того, как выглядит мое текущее приложение.Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code

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

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

Ссылка предполагает, что способ сделать это

  • использовать коллекцию хэшей / свойств сеанса в случае, если состояние для каждого пользователя.
  • использовать коллекцию хешей / свойств приложения, если состояние глобальное

Вопросы:

  1. Это правильно? Я скучаю по некоторым магическим атрибутам?
  2. Я попробовал метод хеш-таблицы приложения... заполнение некоторых известных ключей по первому запросу. Однако по второму запросу хеш-таблица находится в чистом состоянии / без элементов.
  3. Как мне справиться с синхронизацией?.net способ блокировки частного объекта не будет работать.

Мой класс веб-службы выглядит следующим образом..

[WebService(Namespace = "http://Walkthrough/XmlWebServices/", 
      Description="A temperature conversion xml web service")]
   [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   [System.ComponentModel.ToolboxItem(false)]

   public class TemperatureConverter : System.Web.Services.WebService, IDisposable
   {
      [WebMethod(Description = "This method converts celsius to fahrenheit")]
      public double convert_fahrenheit_to_celsius(double temp_in_fahrenheit)
      {
         /// code
      }
    }

Обновление: я все еще борюсь с Q#2. Там какое-то странное поведение

protected void Application_Start(object sender, EventArgs e)  // global.asax.cs
{
         Application["UserName"] = "Gishu";
}

myWebMethod // MyWebService.cs
{
  if (Application["myKey"] == null)
    LoadHeavyObjectsAndCacheKeys(); // set Application["myKey"] between  Application.Lock() Unlock() calls.
  ...
} 

Запись ключа "UserName" завершена успешно - она ​​присутствует в хэше. Однако пары ключ-значение, которые я пишу в своем веб-методе, не выдерживают текущий веб-запрос. При следующем запросе в хеш-таблице остается только один элемент - "Имя пользователя". Поскольку это ApplicationState, я предполагаю, что мне не нужно устанавливать для свойства EnableSession значение true.

1 ответ

Да, вы должны использовать Session состояние для данных сеанса и Application состояние для данных приложения.

Ваши операции веб-службы должны иметь [WebMethod(EnableSession=true)] приписывать им.

Другие вопросы по тегам