Как предотвратить кеширование веб-сервисов в веб-службе ASP.NET?

В моем приложении ASP.NET я заметил, что результаты любых вызовов веб-сервисов кэшируются. Я не хочу, чтобы какие-либо результаты были кэшированы, как я могу остановить браузер от кеширования результатов?

Update:

Здесь прокси-код, сгенерированный путем вызова URL-адреса веб-службы, добавляющего '/js', например. /mywebservice.asmx/js

var MyWebService=function() {
MyWebService.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succeeded = null;
this._failed = null;
}
MyWebService.prototype={
SomeWebMethod:function(itemID,succeededCallback, failedCallback, userContext) {
return this._invoke(MyWebService.get_path(), 'SomeWebMethod',false,
{itemID:itemID},succeededCallback,failedCallback,userContext); }}
MyWebService.registerClass('MyWebService',Sys.Net.WebServiceProxy);
MyWebService._staticInstance = new MyWebService();
MyWebService.set_path = function(value) { MyWebService._staticInstance._path = value; }
MyWebService.get_path = function() { return MyWebService._staticInstance._path; }
MyWebService.set_timeout = function(value) { MyWebService._staticInstance._timeout = value; }
MyWebService.get_timeout = function() { return MyWebService._staticInstance._timeout; }
MyWebService.set_defaultUserContext = function(value) { MyWebService._staticInstance._userContext = value; }
MyWebService.get_defaultUserContext = function() { return MyWebService._staticInstance._userContext; }
MyWebService.set_defaultSucceededCallback = function(value) { MyWebService._staticInstance._succeeded = value; }
MyWebService.get_defaultSucceededCallback = function() { return MyWebService._staticInstance._succeeded; }
MyWebService.set_defaultFailedCallback = function(value) { MyWebService._staticInstance._failed = value; }
MyWebService.get_defaultFailedCallback = function() { return MyWebService._staticInstance._failed; }
MyWebService.set_path("/MyWebService.asmx");
MyWebService.SomeWebMethod= function(itemID,onSuccess,onFailed,userContext)
{MyWebService._staticInstance.SomeWebMethod(itemID,onSuccess,onFailed,userContext); }

Я вызываю службу, используя:

MyWebService.SomeWebMethod(
itemID,
function(sender, e)
 {
    // do something
},
function(sender, e)
{
   // handle failure
});

Я использую предложенную технику (добавьте параметр к URL-адресу с некоторым случайным значением) с другими страницами, чтобы предотвратить их кэширование, но я удивлен, что мне нужно использовать эту технику с вызовом веб-службы, учитывая, что они являются POST-вызовами по умолчанию в ASP.NET 2.0 и не должны кэшироваться в первую очередь.

Ответ 1

Если у вас есть контроль над сервером, посмотрите здесь для IIS7

В старых версиях IIS добавьте

Cache-Control: no-cache 

в заголовки для файла ASMX/SVC (или для всего каталога)

Ответ 2

  как я могу запретить браузеру кэшировать результаты?

Может быть, вы используете ASP.NET AJAX? Если так, то я думаю, что вы имеете в виду, что вызовы ajax кэшируются браузером. Если это так, взгляните на это: http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/.

Ответ 3

Когда вы делаете запрос к веб-службе, добавьте уникальное значение к querystring, например текущую дату и время, преобразованные в числовое значение, это гарантирует, что каждый раз он обрабатывается как уникальный запрос и не кэширует ответы будут иметь место.

В частности, метод Javscript Date.getTime():

var d = new Date();
var uniqueValue = d.getTicks();

// Now append uniqueValue to the querystring you're calling the webservice with
// and it'll ensure the request is treated as unique by the browsers cache

Ответ 4

Я предполагаю, что вы используете IE... это лаваш для управления кешем.

Заголовок управления кешем может управляться на основе запроса по запросу с использованием объекта ответа. Имейте в виду, что вы не можете изменить заголовок ответа после того, как вы выпустили первый байт тела ответа.