From 1dcafe5df4b3d1830f0ebe576193218917211012 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 12 Dec 2013 12:37:06 -0800 Subject: [PATCH] Added basic HttpRequestMessage and HttpResponseMessage. --- Microsoft.AspNet.Mvc/ActionResultFactory.cs | 34 +++++++++++++++++ .../ControllerActionInvoker.cs | 31 +++------------ .../ControllerActionInvokerFactory.cs | 15 +++++--- .../HttpResponseMessageActionResult.cs | 38 +++++++++++++++++++ Microsoft.AspNet.Mvc/IActionResultFactory.cs | 8 ++++ .../Microsoft.AspNet.Mvc.csproj | 11 ++++++ Microsoft.AspNet.Mvc/MvcHandler.cs | 2 +- Microsoft.AspNet.Mvc/MvcServices.cs | 1 + Microsoft.AspNet.Mvc/packages.config | 2 + MvcSample/Home2Controller.cs | 3 +- MvcSample/HomeController.cs | 11 +++++- MvcSample/MvcSample.csproj | 9 +++++ MvcSample/packages.config | 2 + 13 files changed, 133 insertions(+), 34 deletions(-) create mode 100644 Microsoft.AspNet.Mvc/ActionResultFactory.cs create mode 100644 Microsoft.AspNet.Mvc/HttpResponseMessageActionResult.cs create mode 100644 Microsoft.AspNet.Mvc/IActionResultFactory.cs diff --git a/Microsoft.AspNet.Mvc/ActionResultFactory.cs b/Microsoft.AspNet.Mvc/ActionResultFactory.cs new file mode 100644 index 0000000000..785ef44bf2 --- /dev/null +++ b/Microsoft.AspNet.Mvc/ActionResultFactory.cs @@ -0,0 +1,34 @@ +using System.Net.Http; +using System.Net.Http.Formatting; + +namespace Microsoft.AspNet.Mvc +{ + public class ActionResultFactory : IActionResultFactory + { + public IActionResult CreateActionResult(object actionReturnValue) + { + var actionResult = actionReturnValue as IActionResult; + + if (actionResult != null) + { + return actionResult; + } + + var responseMessage = actionReturnValue as HttpResponseMessage; + if (responseMessage != null) + { + return new HttpResponseMessageActionResult(responseMessage); + } + + // all other object types are treated as an http response message action result + var content = new ObjectContent(actionReturnValue.GetType(), + actionReturnValue, + new JsonMediaTypeFormatter()); + + return new HttpResponseMessageActionResult(new HttpResponseMessage + { + Content = content + }); + } + } +} diff --git a/Microsoft.AspNet.Mvc/ControllerActionInvoker.cs b/Microsoft.AspNet.Mvc/ControllerActionInvoker.cs index 01b9b0bc33..5482b02ee1 100644 --- a/Microsoft.AspNet.Mvc/ControllerActionInvoker.cs +++ b/Microsoft.AspNet.Mvc/ControllerActionInvoker.cs @@ -1,5 +1,4 @@ using System; -using System.Globalization; using System.Reflection; using System.Threading.Tasks; @@ -7,11 +6,13 @@ namespace Microsoft.AspNet.Mvc { public class ControllerActionInvoker : IActionInvoker { - private ControllerContext _context; + private readonly ControllerContext _context; + private readonly IActionResultFactory _actionResultFactory; - public ControllerActionInvoker(ControllerContext context) + public ControllerActionInvoker(ControllerContext context, IActionResultFactory actionResultFactory) { _context = context; + _actionResultFactory = actionResultFactory; } public Task InvokeActionAsync(string actionName) @@ -23,31 +24,11 @@ namespace Microsoft.AspNet.Mvc throw new InvalidOperationException(String.Format("Could not find action method '{0}'", actionName)); } - object actionReturnValue = method.Invoke(_context.Controller, null); ; + object actionReturnValue = method.Invoke(_context.Controller, null); - IActionResult actionResult = CreateResult(actionReturnValue); + IActionResult actionResult = _actionResultFactory.CreateActionResult(actionReturnValue); return actionResult.ExecuteResultAsync(_context); } - - private IActionResult CreateResult(object actionReturnValue) - { - IActionResult actionResult = actionReturnValue as IActionResult; - - if (actionResult != null) - { - return actionResult; - } - - if (actionReturnValue != null) - { - return new ContentResult - { - Content = Convert.ToString(actionReturnValue, CultureInfo.InvariantCulture) - }; - } - - return new EmptyResult(); - } } } diff --git a/Microsoft.AspNet.Mvc/ControllerActionInvokerFactory.cs b/Microsoft.AspNet.Mvc/ControllerActionInvokerFactory.cs index 44d12da40e..6d40b2a756 100644 --- a/Microsoft.AspNet.Mvc/ControllerActionInvokerFactory.cs +++ b/Microsoft.AspNet.Mvc/ControllerActionInvokerFactory.cs @@ -1,15 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - + namespace Microsoft.AspNet.Mvc { public class ControllerActionInvokerFactory : IActionInvokerFactory { + private readonly IActionResultFactory _actionResultFactory; + + public ControllerActionInvokerFactory(IActionResultFactory actionResultFactory) + { + _actionResultFactory = actionResultFactory; + } + public IActionInvoker CreateInvoker(ControllerContext context) { - return new ControllerActionInvoker(context); + return new ControllerActionInvoker(context, _actionResultFactory); } } } diff --git a/Microsoft.AspNet.Mvc/HttpResponseMessageActionResult.cs b/Microsoft.AspNet.Mvc/HttpResponseMessageActionResult.cs new file mode 100644 index 0000000000..0eac692479 --- /dev/null +++ b/Microsoft.AspNet.Mvc/HttpResponseMessageActionResult.cs @@ -0,0 +1,38 @@ +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Mvc +{ + public class HttpResponseMessageActionResult : IActionResult + { + public HttpResponseMessage ResponseMessage { get; set; } + + public HttpResponseMessageActionResult(HttpResponseMessage responseMessage) + { + ResponseMessage = responseMessage; + } + + public async Task ExecuteResultAsync(ControllerContext context) + { + var response = context.HttpContext.Response; + response.StatusCode = (int)ResponseMessage.StatusCode; + + foreach (var responseHeader in ResponseMessage.Headers) + { + response.Headers.AppendValues(responseHeader.Key, responseHeader.Value.ToArray()); + } + + var content = ResponseMessage.Content; + if (content != null) + { + foreach (var responseHeader in content.Headers) + { + response.Headers.AppendValues(responseHeader.Key, responseHeader.Value.ToArray()); + } + + await content.CopyToAsync(response.Body); + } + } + } +} diff --git a/Microsoft.AspNet.Mvc/IActionResultFactory.cs b/Microsoft.AspNet.Mvc/IActionResultFactory.cs new file mode 100644 index 0000000000..b3894aa450 --- /dev/null +++ b/Microsoft.AspNet.Mvc/IActionResultFactory.cs @@ -0,0 +1,8 @@ + +namespace Microsoft.AspNet.Mvc +{ + public interface IActionResultFactory + { + IActionResult CreateActionResult(object actionReturnValue); + } +} diff --git a/Microsoft.AspNet.Mvc/Microsoft.AspNet.Mvc.csproj b/Microsoft.AspNet.Mvc/Microsoft.AspNet.Mvc.csproj index 60fdb5063f..4c8aef6701 100644 --- a/Microsoft.AspNet.Mvc/Microsoft.AspNet.Mvc.csproj +++ b/Microsoft.AspNet.Mvc/Microsoft.AspNet.Mvc.csproj @@ -33,16 +33,26 @@ ..\packages\Microsoft.Owin.2.0.2\lib\net45\Microsoft.Owin.dll + + ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + False + ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll + + + @@ -52,6 +62,7 @@ + diff --git a/Microsoft.AspNet.Mvc/MvcHandler.cs b/Microsoft.AspNet.Mvc/MvcHandler.cs index 34c8fb87b7..7b59185261 100644 --- a/Microsoft.AspNet.Mvc/MvcHandler.cs +++ b/Microsoft.AspNet.Mvc/MvcHandler.cs @@ -1,6 +1,6 @@ using System; -using System.Linq; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.CoreServices; using Microsoft.Owin; diff --git a/Microsoft.AspNet.Mvc/MvcServices.cs b/Microsoft.AspNet.Mvc/MvcServices.cs index 0672624be4..d213a4e9e2 100644 --- a/Microsoft.AspNet.Mvc/MvcServices.cs +++ b/Microsoft.AspNet.Mvc/MvcServices.cs @@ -17,6 +17,7 @@ namespace Microsoft.AspNet.Mvc callback(typeof(IControllerFactory), typeof(DefaultControllerFactory)); callback(typeof(IActionInvokerFactory), typeof(ControllerActionInvokerFactory)); callback(typeof(IActionResultHelper), typeof(ActionResultHelper)); + callback(typeof(IActionResultFactory), typeof(ActionResultFactory)); } } } diff --git a/Microsoft.AspNet.Mvc/packages.config b/Microsoft.AspNet.Mvc/packages.config index 57b34eaa5d..a10697e040 100644 --- a/Microsoft.AspNet.Mvc/packages.config +++ b/Microsoft.AspNet.Mvc/packages.config @@ -1,5 +1,7 @@  + + \ No newline at end of file diff --git a/MvcSample/Home2Controller.cs b/MvcSample/Home2Controller.cs index f9337caf58..ac417bc590 100644 --- a/MvcSample/Home2Controller.cs +++ b/MvcSample/Home2Controller.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNet.Mvc; +using System.Net.Http; +using Microsoft.AspNet.Mvc; using Microsoft.Owin; namespace MvcSample diff --git a/MvcSample/HomeController.cs b/MvcSample/HomeController.cs index 068468cbe2..e9f98771b0 100644 --- a/MvcSample/HomeController.cs +++ b/MvcSample/HomeController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNet.Mvc; +using System.Net.Http; +using Microsoft.AspNet.Mvc; using Microsoft.Owin; namespace MvcSample @@ -27,5 +28,13 @@ namespace MvcSample { Context.Response.Write("Hello World raw"); } + + public HttpResponseMessage Hello2() + { + var responseMessage = new HttpResponseMessage(); + responseMessage.Content = new StringContent("Hello World"); + + return responseMessage; + } } } \ No newline at end of file diff --git a/MvcSample/MvcSample.csproj b/MvcSample/MvcSample.csproj index f022db652a..161abff845 100644 --- a/MvcSample/MvcSample.csproj +++ b/MvcSample/MvcSample.csproj @@ -46,11 +46,20 @@ ..\packages\Microsoft.Owin.Diagnostics.2.0.2\lib\net40\Microsoft.Owin.Diagnostics.dll + + False + ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + ..\packages\Owin.1.0\lib\net40\Owin.dll + + + False + ..\packages\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45\System.Net.Http.Formatting.dll + diff --git a/MvcSample/packages.config b/MvcSample/packages.config index 82e60bea94..9a47c140a1 100644 --- a/MvcSample/packages.config +++ b/MvcSample/packages.config @@ -1,7 +1,9 @@  + + \ No newline at end of file