#silverlight #iis #exception #caching #wcf-ria-services
#silverlight #iis #исключение #кэширование #wcf-ria-services
Вопрос:
У нас проблема с кэшированием HTTP-ответов при использовании служб WCF RIA с Silverlight.
На стороне сервера у нас есть простой метод получения DomainService без указанного кэширования, например:
[OutputCache(OutputCacheLocation.None)]
public IQueryable<SearchResults> GetSearchResults(string searchText);
Выдает исключение DomainException, когда пользователь не аутентифицирован (т. е. когда срок действия FormsAuthenticationCookie истекает). Все так и задумано.
Но когда пользователь повторно аутентифицируется и запрос вызывается снова с тем же параметром ‘searchText’, запрос никогда не попадает на сервер (точка останова не достигнута; Fiddler показывает, что http-запрос не отправлен).
Я думаю, это связано с тем, что, когда исключение генерируется на сервере, для свойства Cache-Control HTTP-ответа установлено значение ‘private’, и когда клиент хочет выполнить тот же запрос позже (после входа пользователя в систему), браузер даже не отправляет запрос на сервер.
Если мы введем другой параметр поиска, то запрос будет выполнен повторно без проблем.
Есть ли какой-либо способ гарантировать, что http-ответ всегда имеет ‘no-caching’ — даже если он не возвращается нормально?
UPDATE1 Проблема возникает только при развертывании в IIS — при тестировании из Visual Studio с помощью Casini или IIS Express все работает нормально.
UPDATE2 Я обновил вопрос, чтобы отразить новые знания.
Комментарии:
1. Я не уверен, но вы можете попробовать использовать
LoadingData
событие и указатьeventArgs
.LoadBehavior
дляRefreshCurrent
Ответ №1:
Вы не должны вызывать исключение DomainException для ошибок авторизации. Из-за того, как Silverlight обрабатывает ошибки, эти ответы все еще могут кэшироваться вашим браузером. Вместо этого создайте исключение UnauthorizedAccessException из вашего DomainService, и это должно исправить ошибку кэширования на клиенте.
Комментарии:
1. Я попробовал это, и это ничего не изменило : (Кстати, эта проблема возникает только с IIS — при тестировании с помощью Casini или IIS Express проблем нет!
2. Я обновил вопрос с момента вашего ответа, потому что теперь я подозреваю, что браузер кэширует ответ, а не элемент управления silverlight.
3. Спасибо за вашу помощь, Кайл — ответ привел меня к точной проблеме (HTTP-ответ кэшируется в браузере). Хотя у меня все еще нет решения. Мы рассматриваем это как известную проблему, потому что на самом деле она не должна часто возникать в рабочей среде. Но все равно раздражает.