Added StatusCode property to OutputFormatterContext
- Fixes issue #1809 - Added relevant tests
This commit is contained in:
parent
8e85d53c88
commit
17aa21dc25
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue