Added StatusCode property to OutputFormatterContext

- Fixes issue #1809
 - Added relevant tests
This commit is contained in:
Ajay Bhargav Baaskaran 2015-01-23 15:39:36 -08:00
parent 8e85d53c88
commit 17aa21dc25
7 changed files with 87 additions and 3 deletions

View File

@ -42,6 +42,7 @@ namespace Microsoft.AspNet.Mvc
DeclaredType = DeclaredType,
ActionContext = context,
Object = Value,
StatusCode = StatusCode
};
var selectedFormatter = SelectFormatter(formatterContext, formatters);
@ -52,9 +53,9 @@ namespace Microsoft.AspNet.Mvc
return;
}
if (StatusCode != null)
if (StatusCode.HasValue)
{
context.HttpContext.Response.StatusCode = (int)StatusCode;
context.HttpContext.Response.StatusCode = StatusCode.Value;
}
OnFormatting(context);

View File

@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Mvc
{
var response = context.ActionContext.HttpContext.Response;
response.ContentLength = 0;
response.StatusCode = 204;
response.StatusCode = context.StatusCode ?? 204;
return Task.FromResult(true);
}
}

View File

@ -37,5 +37,13 @@ namespace Microsoft.AspNet.Mvc
/// The content type which is chosen by the selected formatter.
/// </summary>
public MediaTypeHeaderValue SelectedContentType { get; set; }
/// <summary>
/// Gets the status code that was previously set by the <see cref="ObjectResult"/>.
/// </summary>
/// <remarks>
/// Null indicates no value set by the <see cref="ObjectResult"/>.
/// </remarks>
public int? StatusCode { get; set; }
}
}

View File

@ -430,6 +430,36 @@ namespace Microsoft.AspNet.Mvc.Core.Test.ActionResults
Assert.Equal(input.Length, httpResponse.Object.Body.Length);
}
[Fact]
public async Task ObjectResult_Execute_NullContent_SetsStatusCode()
{
// Arrange
var stream = new MemoryStream();
var expectedStatusCode = 201;
var httpResponse = new Mock<HttpResponse>();
httpResponse.SetupGet(r => r.Body).Returns(stream);
var formatters = new IOutputFormatter[]
{
new HttpNoContentOutputFormatter(),
new StringOutputFormatter(),
new JsonOutputFormatter()
};
var actionContext = CreateMockActionContext(formatters,
httpResponse.Object,
requestAcceptHeader: null,
requestContentType: null);
var result = new ObjectResult(null);
result.StatusCode = expectedStatusCode;
// Act
await result.ExecuteResultAsync(actionContext);
// Assert
httpResponse.VerifySet(r => r.StatusCode = expectedStatusCode);
Assert.Equal(0, httpResponse.Object.Body.Length);
}
[Fact]
public async Task ObjectResult_Execute_CallsJsonResult_SetsContent()
{

View File

@ -127,5 +127,26 @@ namespace Microsoft.AspNet.Mvc.Test
// Assert
Assert.Equal(204, defaultHttpContext.Response.StatusCode);
}
[Fact]
public async Task WriteAsync_ContextStatusCodeSet_WritesSameStatusCode()
{
// Arrange
var defaultHttpContext = new DefaultHttpContext();
var formatterContext = new OutputFormatterContext()
{
Object = null,
ActionContext = new ActionContext(defaultHttpContext, new RouteData(), new ActionDescriptor()),
StatusCode = 201
};
var formatter = new HttpNoContentOutputFormatter();
// Act
await formatter.WriteAsync(formatterContext);
// Assert
Assert.Equal(201, defaultHttpContext.Response.StatusCode);
}
}
}

View File

@ -307,5 +307,22 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
Assert.Equal("us-ascii", response.Content.Headers.ContentType.CharSet);
Assert.Equal("content", await response.Content.ReadAsStringAsync());
}
[Fact]
public async Task ObjectResult_WithStatusCodeAndNoContent_SetsSameStatusCode()
{
// Arrange
var server = TestServer.Create(_provider, _app);
var client = server.CreateClient();
var request = new HttpRequestMessage(
HttpMethod.Get,
"http://localhost/ActionResultsVerification/GetObjectResultWithNoContent");
// Act
var response = await client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
}
}
}

View File

@ -77,6 +77,13 @@ namespace ActionResultsWebSite
return Content("content", "application/json", Encoding.ASCII);
}
public IActionResult GetObjectResultWithNoContent()
{
var result = new ObjectResult(null);
result.StatusCode = 201;
return result;
}
public DummyClass GetDummy(int id)
{
return CreateDummy();