Как создать XML-WebService с сохранением состояния в asp.net? - PullRequest
0 голосов
/ 05 августа 2009

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

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

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

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

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

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

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

Вопросы:

  1. Это правильно? Я скучаю по некоторым магическим атрибутам?
  2. Я попробовал метод хеш-таблицы Application ... заполняя определенные известные ключи при первом запросе. Однако по второму запросу хеш-таблица находится в чистом состоянии / без элементов.
  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 Ответ

1 голос
/ 06 августа 2009

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

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

...