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