Не вдаваясь в дискуссию «Службы с отслеживанием состояния - это плохо» ... Как вы ее создаете?
Из-за отсутствия полезных результатов поиска ... мне кажется, что я ищу неправильные термины, или это активно не поощряется. Лучшая ссылка, которую я мог найти, была эта на MSDN
Чтобы дать краткий контекст того, как выглядит мое текущее приложение. Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code
Пока все хорошо. Теперь выясняется, что когда я делаю первый запрос к WebMethod, ему нужно запускать некоторые процессы / ресурсы, которые стоят дорого для создания-использования-утилизации при каждом вызове. Поэтому я пытался повторно использовать эти ресурсы.
Сначала я попытался превратить их в переменные-члены - только для того, чтобы у каждой лампочки был момент, когда каждый запрос обслуживается новым экземпляром класса MyWebService
и в другом потоке.
Ссылка предполагает, что способ сделать это -
- для использования коллекции хэшей / свойств сеанса в случае, если состояние для пользователя.
- для использования коллекции хэшей / свойств приложения, если состояние глобальное
Вопросы:
- Это правильно? Я скучаю по некоторым магическим атрибутам?
- Я попробовал метод хеш-таблицы Application ... заполняя определенные известные ключи при первом запросе. Однако по второму запросу хеш-таблица находится в чистом состоянии / без элементов.
- Как мне справиться с синхронизацией? .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.