2010-08-04 117 views
1

我有一个传统的C#Web服务(类继承System.Web.Services.WebService),象这样一系列的WebMethods的:如何从.net Web服务设置HTTP缓存控制?

[WebMethod, SoapHeader("header", Direction=SoapHeaderDirection.In)] 
[SoapDocumentMethod("http://www.myservices.com/Services/1.1#getMediaMetadata")] 
public MediaMetadata getMediaMetadata(string id) 
{ 
    return new MediaService().GetMetadata(id); 
} 

我试图设置Cache-Control头经由HttpResponse.Cache.SetMaxAge响应。执行服务产生一个默认的标题:

Cache-Control:private, max-age=0 

我有一个硬编码的头所代替标准Cache.SetMaxAge

HttpContext.Current.Response.AddHeader("Cache-Control", "private, max-age=" + (int)ttl.TotalSeconds); 

但仍然是Web服务器使用默认的Cache-Control响应。我怀疑在web方法执行后,ASP.NET web服务正在使用这种方法。以下建议使用WebMethod的CacheDuration属性不适用于我的方案。

有什么建议吗?

+1

我现在怀疑问题在于客户端发布到web方法的事实,并且HTTP规范说Cache-Control在POST上是不相关的。显然asp.net忽略了SetMaxAge的调用。 – 2010-08-31 21:16:46

回答

0
[WebMethod(CacheDuration=60), SoapHeader("header", Direction = SoapHeaderDirection.In)] 
SoapDocumentMethod("http://www.myservices.com/Services/1.1#getMediaMetadata")] 
public MediaMetadata getMediaMetadata(string id) 
{ 
    return new MediaService().GetMetadata(id); 
} 

将此属性添加到您应该做的伎俩。

如果你特别想访问上下文然后

Context.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(60)); 

您将可以安全地访问上下文,除非它是空。一个简单的检查将为你解决这个问题

+0

谢谢,我无法使用CacheDuration attrib,因为值将根据请求而改变。我知道某些类型的webmethods(单向)可能没有有效的HttpContext。问题在于是否有某种“官方”的方式来从web方法中引用它。 – 2010-08-04 17:48:20

+0

我不是100%肯定,但不是只为服务器缓存CacheDuration?如果我设置它,我仍然会得到“Cache-Control:no-cache Pragma:no-cache Expires:-1”,并且Cache.SetMaxAge不起作用... – Peter 2013-07-31 09:21:15