【问题标题】:how does host differentiate MVC request and Web API request主机如何区分 MVC 请求和 Web API 请求
【发布时间】:2020-02-20 05:18:35
【问题描述】:

我是 asp.net mvc 和 web api 的新手。我正在读一本书,上面写着:

ASP.NET MVC 使用:System.Web.HttpRequest

Web API 等效项是 System.Net.Http.HttpRequestMessage

下图描述web api的请求和结果流程

所以我的问题是,托管环境(通常是 IIS)如何知道它应该创建一个 HttpRequestMessage 对象来表示来自客户端的请求?我的意思是如果应用程序是MVC应用程序,IIS应该创建一个HttpRequest对象而不是HttpRequestMessage,那么IIS怎么知道要创建哪个呢?

【问题讨论】:

  • 在高层次上,您可以只在 IIS 中拥有一个托管代码处理程序。然后将加载 WebAPI 或 MVC 框架库,它将基 IIS 类转换为适当的框架包装器。 WebAPI 的更改是为了使代码更易于单元测试,因为一切都变得抽象了。

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

从您发布的图片中可以看出,HttpRequestMessage 仅存在于“托管”环境中,Web 浏览器客户端对此一无所知。

在“托管”世界中,IIS 应用程序池正在运行您构建和部署的代码,它非常了解您正在使用的框架,因为您的代码还包含您列出的使用程序集 System.Web... 或 System .Net...

考虑一下,即使您已经展示了托管、控制器和操作之间的分离,所有这些都在 IIS 的同一个应用程序池中运行,它再次运行您的代码,因此知道它是关于什么的,因为您的 IL 程序集是从您的具体源码。

【讨论】:

  • 感谢您的回答。我从来没有 IIS 的经验,所以再次确认一下:创建不同的对象是 IIS 的工作,如果部署的应用程序是 MVC 应用程序,那么 IIS 会创建HttpRequest ?
【解决方案2】:

我不确定我是否理解您的问题,但这可能是您正在寻找的:

我的意思是如果应用程序是 MVC 应用程序,IIS 应该创建一个 HttpRequest对象而不是HttpRequestMessage,那么IIS怎么知道 要创建哪一个?

您必须记住如何区分普通 MVC 控制器和 Web API 控制器...

WebAPI 控制器强制执行此注解 [ApiController],并且必须继承自 ControllerBase

[ApiController] public class PeopleController : ControllerBase { //Your API methods here }

普通的 MVC 控制器只继承自 Controller 基类:

public class PeopleController : Controller { //Your Action methods here... }

那些已经为您的 APP 创建了配置,这让您的托管环境更容易知道发生了什么以及何时返回什么。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多