【问题标题】:How to prevent web service results from being cached in an ASP.NET web service?如何防止 Web 服务结果缓存在 ASP.NET Web 服务中?
【发布时间】:2011-04-02 20:14:02
【问题描述】:

在我的 ASP.NET 应用程序中,我注意到所有 Web 服务调用的结果都被缓存了。我不想缓存任何结果,如何阻止浏览器缓存结果?

更新:

这是通过调用附加“/js”的 Web 服务 URL 生成的代理代码,例如/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)以防止它们被缓存,但我很惊讶我需要将此技术与 Web 服务调用一起使用,因为它们在 ASP.NET 2.0 中默认是 POST 调用,一开始就不应该被缓存。

【问题讨论】:

  • 什么是操作系统? win2k3 或 ... 让我们知道 .net 框架版本。

标签: .net asp.net web-services


【解决方案1】:

当您向 Web 服务发出请求时,将唯一值附加到查询字符串,例如将当前日期和时间转换为数值,这将确保每次都将其视为唯一请求,并且不会缓存会有回应。

特别是 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

【讨论】:

  • 但是我该怎么做呢?我使用 javascript 在客户端调用服务。
  • 在客户端上,我使用在调用服务时生成的代理代码调用服务,并将“/js”附加到其 URL 的末尾。我应该更改代理代码以使其在 javascript 中添加时间/日期吗?
  • 如果您不知道如何将其添加到问题中,请在您的问题中添加您用于调用服务的代码示例,我会采用它并将其纳入我的答案=)
  • 我从未使用过 ap.net 网络服务代理,所以我猜(但不能肯定!)这和任何一个赌注一样好 =)
  • 非常感谢。只是另一个问题,首先如何缓存结果?不要 ASP.NET 使用不应该首先缓存的 POST 调用(AFAIK,他们在 ASP.NET 2.0 中进行了更改以默认使用 POST)?另外,我看到还有另一个选项可以通过更改 [WebMethod] 属性来防止缓存(在缓存控制标头中发送 no-cache)。与在客户端更改 Web 服务的 URL 相比,这样做的优点/缺点是什么?
【解决方案2】:

如何阻止浏览器缓存结果?

可能是您使用的是 ASP.NET ajax 吗?如果是这样,那么我认为您的意思是 ajax 调用被浏览器缓存。如果是这样,那么看看这个:http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/

【讨论】:

  • 谢谢,我去看看。但实际上结果缓存在所有浏览器中,而不仅仅是 IE。
  • 我知道,但主要话题是您使用的是 ajax 并且您可以关闭缓存。看看这篇文章。
【解决方案3】:

如果您可以控制服务器,请查看here 的 IIS7

在旧版本的 IIS 上添加一个

Cache-Control: no-cache 

到 ASMX / SVC 文件(或整个目录)的标题

【讨论】:

    【解决方案4】:

    我猜你使用的是 IE……是关于缓存控制的皮塔。

    可以使用响应对象逐个请求地管理缓存控制标头。请注意,一旦发出响应正文的第一个字节,就无法修改响应标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多