Skip to content

Commit f7cd52d

Browse files
committed
added IHttpActionResult handling
1 parent edba494 commit f7cd52d

3 files changed

Lines changed: 38 additions & 3 deletions

File tree

src/WebApi.OutputCache.V2/CacheOutputAttribute.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,15 @@ protected virtual MediaTypeHeaderValue GetExpectedMediaType(HttpConfiguration co
9999
var negotiator = config.Services.GetService(typeof(IContentNegotiator)) as IContentNegotiator;
100100
var returnType = actionContext.ActionDescriptor.ReturnType;
101101

102-
if (negotiator != null && returnType != typeof(HttpResponseMessage))
102+
if (negotiator != null && returnType != typeof(HttpResponseMessage) && (returnType != typeof(IHttpActionResult) || typeof(IHttpActionResult).IsAssignableFrom(returnType)))
103103
{
104104
var negotiatedResult = negotiator.Negotiate(returnType, actionContext.Request, config.Formatters);
105+
106+
if (negotiatedResult == null)
107+
{
108+
return DefaultMediaType;
109+
}
110+
105111
responseMediaType = negotiatedResult.MediaType;
106112
if (string.IsNullOrWhiteSpace(responseMediaType.CharSet))
107113
{
@@ -113,8 +119,7 @@ protected virtual MediaTypeHeaderValue GetExpectedMediaType(HttpConfiguration co
113119
if (actionContext.Request.Headers.Accept != null)
114120
{
115121
responseMediaType = actionContext.Request.Headers.Accept.FirstOrDefault();
116-
if (responseMediaType == null ||
117-
!config.Formatters.Any(x => x.SupportedMediaTypes.Contains(responseMediaType)))
122+
if (responseMediaType == null || !config.Formatters.Any(x => x.SupportedMediaTypes.Contains(responseMediaType)))
118123
{
119124
return DefaultMediaType;
120125
}

test/WebApi.OutputCache.V2.Tests/ServerSideTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,30 @@ public void etag_not_match_304_if_none_match()
267267
Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
268268
}
269269

270+
[Test]
271+
public void can_handle_ihttpactionresult_with_default_media_type()
272+
{
273+
var client = new HttpClient(_server);
274+
var result = client.GetAsync(_url + "Get_ihttpactionresult").Result;
275+
276+
_cache.Verify(s => s.Contains(It.Is<string>(x => x == "sample-get_ihttpactionresult:application/json; charset=utf-8")), Times.Exactly(2));
277+
_cache.Verify(s => s.Add(It.Is<string>(x => x == "sample-get_ihttpactionresult"), It.IsAny<object>(), It.Is<DateTimeOffset>(x => x <= DateTime.Now.AddSeconds(100)), null), Times.Once());
278+
_cache.Verify(s => s.Add(It.Is<string>(x => x == "sample-get_ihttpactionresult:application/json; charset=utf-8"), It.IsAny<object>(), It.Is<DateTimeOffset>(x => x <= DateTime.Now.AddSeconds(100)), It.Is<string>(x => x == "sample-get_ihttpactionresult")), Times.Once());
279+
}
280+
281+
[Test]
282+
public void can_handle_ihttpactionresult_with_non_default_media_type()
283+
{
284+
var client = new HttpClient(_server);
285+
var req = new HttpRequestMessage(HttpMethod.Get, _url + "Get_ihttpactionresult");
286+
req.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
287+
var result = client.SendAsync(req).Result;
288+
289+
_cache.Verify(s => s.Contains(It.Is<string>(x => x == "sample-get_ihttpactionresult:text/xml; charset=utf-8")), Times.Exactly(2));
290+
_cache.Verify(s => s.Add(It.Is<string>(x => x == "sample-get_ihttpactionresult"), It.IsAny<object>(), It.Is<DateTimeOffset>(x => x <= DateTime.Now.AddSeconds(100)), null), Times.Once());
291+
_cache.Verify(s => s.Add(It.Is<string>(x => x == "sample-get_ihttpactionresult:text/xml; charset=utf-8"), It.IsAny<object>(), It.Is<DateTimeOffset>(x => x <= DateTime.Now.AddSeconds(100)), It.Is<string>(x => x == "sample-get_ihttpactionresult")), Times.Once());
292+
}
293+
270294

271295
//[Test]
272296
//public void must_add_querystring_to_cache_params()

test/WebApi.OutputCache.V2.Tests/TestControllers/SampleController.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,5 +146,11 @@ public void Post_2_invalidates()
146146
{
147147
//do nothing
148148
}
149+
150+
[CacheOutput(ClientTimeSpan = 100, ServerTimeSpan = 100)]
151+
public IHttpActionResult Get_ihttpactionresult()
152+
{
153+
return Ok("value");
154+
}
149155
}
150156
}

0 commit comments

Comments
 (0)