2009-08-05 4 views
0

Не вдаваясь в «Бесконечные услуги плохо» обсуждение ... Как вы его создаете?Как создать stateful XML WebService в asp.net?

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

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

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

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

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

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

Вопросы:

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

ответ

1

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

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

+0

Спасибо за подтверждение .. однако у меня возникли проблемы с тем, чтобы состояние приложения сохранялось. См. Обновление к моему вопросу. Также я запускаю сервер разработки ASP.Net - может ли это вызвать такое поведение? – Gishu

+0

Предлагайте упростить стратегию отладки. Скопируйте код из Application_Start в веб-метод, но затем измените ключ на «Username1».Посмотрите, инициализирована ли эта ячейка этой второй раз, когда вы вызываете веб-метод. –

Смежные вопросы