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