Не вдаваясь в «Бесконечные услуги плохо» обсуждение ... Как вы его создаете?Как создать stateful XML WebService в asp.net?
Из-за отсутствия полезных результатов поиска. Кажется, я либо искал неправильные термины, либо его активно обескураживают. Лучшее звено, которое я мог найти, было this one on MSDN
Чтобы дать краткий контекст того, как выглядит мое текущее приложение. Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code
Пока все хорошо. Теперь выясняется, что когда я делаю первый запрос к WebMethod, ему нужно запустить некоторые процессы/ресурсы, которые дорогостоящие для создания-использования-распоряжения при каждом вызове. Поэтому я искал повторное использование этих ресурсов.
Сначала я попытался превратить их в переменные-члены - только для того, чтобы каждый запрос обслуживался новым экземпляром класса MyWebService
и в другом потоке.
Ссылка показывает, что способ сделать это
- использовать хэш-Session/коллекция свойств в случае состояние каждого пользователя.
- использовать коллекцию хэш Application/свойства в случае, если государство является глобальной
Вопросы:
- Является ли это правильно? Не хватает ли некоторых магических атрибутов?
- Я пробовал метод hashtable приложения ... заполняя некоторые известные ключи по первому запросу. Однако по второму запросу хеш-таблица находится в состоянии clean/no items.
- Как обрабатывать синхронизацию? .net-способ блокировки на частном объекте-члене не будет работать.
My Web Service класс выглядит следующим образом ..
[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
}
}
Update: Я до сих пор борется с 2-Q #. Там какая-то странное поведение
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» ключ записи удачен - он присутствует в хэш. Однако пары ключевого значения, которые я пишу в своем веб-методе, не выдерживают текущий веб-запрос. При следующем запросе хэш-таблица все еще имеет только один элемент - «UserName». Поскольку это ApplicationState, я предполагаю, что мне не нужно устанавливать для свойства EnableSession значение true.
Спасибо за подтверждение .. однако у меня возникли проблемы с тем, чтобы состояние приложения сохранялось. См. Обновление к моему вопросу. Также я запускаю сервер разработки ASP.Net - может ли это вызвать такое поведение? – Gishu
Предлагайте упростить стратегию отладки. Скопируйте код из Application_Start в веб-метод, но затем измените ключ на «Username1».Посмотрите, инициализирована ли эта ячейка этой второй раз, когда вы вызываете веб-метод. –