2013-07-10 42 views
2

我想使用自定义DelegatingHandler将E-Tag标头添加到某些Web API调用的响应中。这里是我的SendAsync()覆盖的部分:如何控制MVC 4 Web API中的ETag标头?

if (request.Method == HttpMethod.Get) 
{ 
    HttpResponseMessage response; 
    if (request.Headers.IfNoneMatch.Count == 0) 
    { 
     response = await base.SendAsync(request, cancellationToken); 
     response.Headers.Add("X-MyStupidTestHeader","It's here"); //<- this is always on my responses 
     response.Content.Headers.Expires = DateTimeOffset.Now.AddMinutes(10.0); 
     var tag = TagStore.Fetch(request.RequestUri); // <- this is non-null 
     if (tag != null) 
      response.Headers.ETag = new EntityTagHeaderValue(tag); //<- this is nowhere to be found. WTF? 
     return response; 
    } 
... 
} 

当我将其称为URL中使用Fiddler浏览器监听我得到如下回应:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/11.0.0.0 
Date: Wed, 10 Jul 2013 16:08:00 GMT 
X-AspNet-Version: 4.0.30319 
X-MyStupidTestHeader: It's here 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Content-Type: text/html; charset=utf-8 
Content-Length: 18 
Connection: Close 

{ 
    "carId": 2 
} 

我知道我的DelegatingHandler获取调用,因为我已经设定了断点。在我的SendAsync覆盖的出路上,响应具有电子标签值;但是当它离开服务器时,它不在那里,并且所有这些缓存头都在那里,告诉客户端不要缓存。我的所有使用Google表明这取决于我设置缓存,这很好,但是如何阻止的Web API不缓存

更新:我意识到有这样的事情的库,但我宁愿不使用它们。

回答

3

ETag头没有写入响应,因为您没有使用缓存。此行为仅针对Visual Studio开发服务器。如果您在IIS中进行部署,您将看到ETag标头以回应您的处理程序代码。

即使使用Visual Studio开发服务器,如果您启用缓存,ETag标头也会出现在响应中。

response.Headers.CacheControl = new CacheControlHeaderValue() 
{ 
    MaxAge = TimeSpan.FromSeconds(60), 
    MustRevalidate = true, 
    Private = true 
}; 
+0

设置CacheControl标头是否像你在代码中打开缓存? – ageektrapped

+0

我在Visual Studio中切换到IIS Express,并且有我的E-Tag头文件!很高兴我不疯狂。 – ageektrapped

+1

设置'CacheControl'头部确实打开了缓存。 'Private = true'只会让用户代理缓存,而不会让代理等任何中介。无论如何,这个问题不适用于IIS和IIS Express,只适用于VS开发服务器。 – Badri