ASP.NET MVC 网站(不是项目)是不是可以返回 HttpResponseMessage

Posted

技术标签:

【中文标题】ASP.NET MVC 网站(不是项目)是不是可以返回 HttpResponseMessage【英文标题】:Is it possible for ASP.NET MVC website (not project) to return HttpResponseMessageASP.NET MVC 网站(不是项目)是否可以返回 HttpResponseMessage 【发布时间】:2013-12-02 04:51:27 【问题描述】:

我正在使用 ASP.NET MVC(不是 ASP.NET Web API)创建一个 RESTful Web 服务。我想要做的是让控制器中的每个方法都根据输入参数(即 json 或 xml)返回它们的结果。

如果我使用的是 ASP.NET Web API,则 HttpResponseMessage 可用于此目的。当我尝试从 ASP.NET MVC 中的控制器返回 HttpResponseMessage 时,没有详细信息。

我已经读过,在这种方法中,我应该使用 ActionResult。如果我这样做,那么我需要创建一个继承自 ActionResult 的 XmlResult,因为它不受支持。

我的问题是为什么 HttpResponseMessage 在这两种情况下的工作方式都不一样。我知道在 Web API 中,我们继承自 ApiController,而在 ASP.NET MVC 中,我们继承自 System.Web.Mvc.Controller。

非常感谢任何帮助。

谢谢,

编辑 1 非常感谢 Fals 的投入。我的问题是如何创建一个空网站并添加所有必要的功能。解决方案是使用 Nuget 获取 cmets 中提到的包,然后按照How to integrate asp.net mvc to Web Site Project 中的步骤操作。

【问题讨论】:

【参考方案1】:

事实上,这确实是可能的。你基本上有两种选择:

开发您的自定义 ActionResult 类型,这可能是一项繁重的工作,也很难维护。 为您的网站添加 WebAPI 支持。

我建议你做后者,这样你就可以两全其美了。为此,您应该执行以下操作:

使用 NuGet 安装以下 Web API 包:Microsoft.AspNet.WebApi.CoreMicrosoft.AspNet.WebApi.WebHost。 将一个或多个 ApiControllers 添加到您的 /Controllers/ 文件夹。 将 WebApiConfig.cs 文件添加到您的 /App_Config/ 文件夹中,您可以在其中定义 Web API 路由方案并在 Global.asax.cs 中注册该类(或 Startup.cs) 文件。

整个过程在here 中得到了完整的解释:各个步骤,连同它们的优缺点以及您可以根据您的具体情况采取的各种替代方案,都记录在我的博客上in this post。

【讨论】:

【参考方案2】:

Web Api 是一个基于 HTTP 开发 Restfull 服务的框架。该框架被分离到另一个程序集System.Web.Http,因此您可以在任何地方托管它,而不仅仅是在 IIS 中。 Web API 直接使用 HTTP 请求/响应,然后每个控制器都继承自 IHttpController

Getting Started with ASP.NET Web API

MVC 在System.Web.Mvc 上有它的实现。再加上 ASP.NET Framework,那么您必须在 Web Application 中使用它。每个 MVC 控制器都继承自 IController,它在您和真正的 HttpRequest 之间建立了一个抽象层。

您仍然可以直接在 MVC 控制器中使用 HttpContext.Response 访问请求,或者如您所说,继承一个新的 ActionResult 来完成这项工作,例如:

public class NotFoundActionResult : ActionResult

 private string _viewName;
 public NotFoundActionResult()
 

 
 public NotFoundActionResult(string viewName)
 
  _viewName = viewName;
 
 public override void ExecuteResult(ControllerContext context)
 
  context.HttpContext.Response.StatusCode = 404;
  context.HttpContext.Response.TrySkipIisCustomErrors = true;

  new ViewResult  ViewName = string.IsNullOrEmpty(_viewName) ? "Error" : _viewName.ExecuteResult(context);
 

这个ActionResult有响应思想HTTP错误的意思。

【讨论】:

是否可以在网站内使用 Web API?两者都是MVC。这不只是每个包中包含的包吗? 是的,默认模板已经自带了Web API。如果你没有得到它,只需从 nuget 安装 Web Api Web Host 包! :) 如果我想从一个空站点开始,最好的使用步骤是什么?我用Nuget得到:Microsoft.Net.Http.2.2.18、Microsoft.AspNet.WebApi.Core.5.0.0、Microsoft.AspNet.WebApi.Client.5.0.0、Microsoft.AspNet.Razor.2.0.30506.0、 AspNetMvc.4.0.20710.0、Microsoft.AspNet.Razor2.0.30506.0 和 Microsoft.AspNet.WebPages.2.0.30506.0。一切都建立了,但它不能显示任何东西 最新版本是 Web API 2,随 VS 2013 和 VS 2012 更新 :D: blogs.msdn.com/b/webdev/archive/2013/11/18/… 让它工作 - 没有正确的 URL。非常感谢您的帮助!我最大的问题是我无法弄清楚如何将它创建为一个网站。我让它工作的是来自模板的 Web Api 项目,但我们不想在部署时发布已编译的程序集 - 因此是疯狂的匆忙。

以上是关于ASP.NET MVC 网站(不是项目)是不是可以返回 HttpResponseMessage的主要内容,如果未能解决你的问题,请参考以下文章

IoC 是不是会导致 ASP.NET MVC Controller 构造函数的参数过多?

ASP.NET 5 MVC6 错误:项目不是 Web 项目

ASP .NET MVC5 中的 CORS

使用 asp.net web api 令牌在 mvc 网站上进行身份验证

服务层是不是应该返回 MVC 应用程序的视图模型?

Angular 路由模板 url 是不是支持 ASP.Net MVC 5 项目中的 *.cshtml 文件?