2013-07-10 83 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