#c# #sql #wcf
#c# #sql #wcf
Вопрос:
У меня есть служба WCF, к которой мой клиент обращается с просьбой запустить ее storedprocedure1
, с param1, param2
помощью и т.д.
Когда служба WCF получает этот вызов, она создает экземпляр класса, который создает экземпляр класса DAO. Класс DAO создает соединение, загружает параметры в SqlCommand
объект, затем выполняет объект.
После завершения он закрывает SqlConnection
, но не закрывает и не удаляет класс DAO, потому что для его запуска требуется несколько процедур.
Вот в чем проблема. Если я отредактирую storedprocedure1
, а затем вызову его через службу WCF, изменения, которые я внес в storedprocedure1
, не будут отражены, пока я не перезапущу службу WCF. Это похоже на то, что storedprocedure1
кэшируется в WCF.
Кто-нибудь еще сталкивался с этим и есть ли решение?
Ответ №1:
Я думаю, что служба WCF кэширует результаты хранимой процедуры.
Смотрите это:http://msdn.microsoft.com/en-us/library/ee230443.aspx
Комментарии:
1. Кэширование выходных данных по умолчанию не включено — кажется вероятным, что OP знал бы об этом, если бы это происходило.
2. вот атрибут для класса WCF
3. вот атрибут для класса WCF [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode. Разрешено)] [ServiceBehavior(InstanceContextMode = InstanceContextMode. Одиночный)] но я никогда явно не включаю кэширование для HTTP или в моей строке подключения. Я должен упомянуть, что проблема возникает при запуске WCF с ServiceHost в консольном приложении, предназначенном для тестирования. Я не видел этой проблемы в размещенном экземпляре IIS. Мы редко меняем хранимые процедуры при развертывании в IIS
Ответ №2:
Я думаю, что ключ, вероятно, заключается в этом утверждении:
но не закрывает и не удаляет класс DAO
Не видя кода для вашего класса DAO, трудно сказать, но кажется более вероятным, что результат запроса кэшируется вашим уровнем доступа к данным, чем то, что он кэшируется WCF.
В любом случае, это действительно не имеет ничего общего с хранимой процедурой, это просто кэширование результата выполнения хранимой процедуры. Если вы изменили данные вместо изменения процедуры, должна возникнуть та же проблема — вы получите устаревшие данные.
Комментарии:
1. я так не думаю. экземпляр SqlCommand создается внутри предложения using . Также, когда я закрываю соединение, я удаляю его. Я изменил свой класс dao для реализации IDisposable, посмотрим, исправит ли это.
2. Вы были правы. Несмотря на то, что я удалял SqlConnection и SqlCommand, отказ от DAO позволял WCF кэшировать их, или сохранять план выполнения, или что-то в этом роде. У меня был dao в качестве частной переменной в классе, который вызывался WCF. Итак, я внес следующие изменения; 1) изменил свой класс DAO для реализации IDisposable и закрыл и удалил там SqlConnection; 2) Создал свой dao внутри предложения usings, а когда это было невозможно, удалил dao в try / finally. Итак, теперь это работает. Спасибо, что обратили внимание на очевидное.