【问题标题】:How to host WebApi only for processing request form a `MVC` project如何托管 Web Api 仅用于处理来自“MVC”项目的请求
【发布时间】:2015-04-26 22:01:29
【问题描述】:

对于这个新项目,我们决定使用ASP.NET MVC 4 作为我们的展示层和WebApi 2 作为服务层。这个想法是 - 当用户与 UI 交互并发送一些请求时,MVC 控制器正在接收这个调用,如果有某种响应信息,则从 MVC 控制器调用WebApi,其中WebApi 是完全不同的解决方案,理论上它可能与 MVC 解决方案在物理上不在同一个地方。

对于 MVC 部分,我有这个控制器:

    public async Task<ActionResult> Index()
    {

        return View("index", await GetUserAsync());
    }

    readonly string uri = "http://localhost:51120/api/user";

    protected async Task<List<User>> GetUserAsync()
    {

        using (HttpClient httpClient = new HttpClient())
        {

            return JsonConvert.DeserializeObject<List<User>>(
                await httpClient.GetStringAsync(uri)
            );
        }
    }

然后我创建了一个ASP.NET Empty Web Application 解决方案。创建解决方案时,我从Nuget 安装了WebApi 2,因此我的项目具有非常基本的结构。我手动创建了ControllersModelsViews 目录。在Controllers 我有一个文件:

public class UserController : ApiController
{
    public List<User> GetStringAsync()
    {
        return new List<User> {new User { Name = "Peter", Age = 41}};
    }
}

Models 我有这个:

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

当我右键单击View 文件夹时,我选择安装Empty view (without model)。所以基本上这就是我的设置。当我开始解决方案时,我得到了这个:

HTTP 错误 403.14 - 禁止 Web 服务器配置为不列出 这个目录的内容。

最可能的原因:没有为 请求的 URL,并且服务器上未启用目录浏览。

如果有必要,我会发布其他内容。我的问题是 - 我该怎么做。如果我只是使用WebApi 模板创建一个 MVC 项目,我想一切都会正常工作,但是这个点的全部意义就消失了。我希望能够将 WebApi 与 MVC 解决方案分开托管,甚至是物理上的并且仅发送和接收呼叫。

【问题讨论】:

  • 您是否在 API 项目中注册了 WebApi 路由?
  • 不,从字面上看,我所做的一切都在我的帖子中进行了描述。你能帮我解决这个问题吗?
  • 当我尝试使用 config.Routes.MapHttpRouterouteTemplate 时出现错误,所以我用 routes.MapRouteurl 更改了它们,但仍然无法正常工作..
  • 假设这是一个路由问题(我的第一个猜测),您最好使用完整模板创建一个一次性项目。 WebApi 包有多个,我用 WebApi 还不足以告诉你需要什么。

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


【解决方案1】:

我认为这是来自服务器的完全有效的响应,因为您没有配置任何路由。 MVC 和 Web API 的路由配置不同。您可以阅读有关 Web API 路由的更多信息here

我认为对您来说最简单的选择是从模板创建一个 Web API 项目。在 VS2013 中,当您创建新的 Web ASP.NET Web 应用程序时,您可以选择要使用的模板。在没有 MVC 的情况下,不可能只选择 Web API。创建项目后,您可以看到App_Start 文件夹中有两个文件:WebApiConfigRouteConfigRouteConfig 是 MVC 的路由。你可以删除这个文件,它在Global.asax中的用法。

编辑:正如@EdSF 提到的,您实际上可以在没有 MVC 的情况下创建 Web API 项目。只需选择 Empty 模板并选中 Web API 复选框。

所以您的WebApiConfig 将如下所示:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

MapHttpAttributeRoutes 用于使attribute routing 工作,MapHttpRoute 类似于 MVC。如您所见,有一个 api 前缀,是否使用它取决于您。一般来说,这不是一个坏主意。例如,如果将来您将拥有 API 的第二个版本,并且您也需要保留第一个版本,那么您可以添加新前缀 apiv2 或类似的东西。

如果您不喜欢 root 的 403.14 响应,您可以为这种情况配置全局处理。例如阅读此question

【讨论】:

  • “不能只选择没有 MVC 的 Web API” - 不正确。您绝对可以创建一个仅 Web API 的项目。
  • @EdSF 感谢您的评论。我更新了答案。我自己并不知道这些功能。
  • 没什么大不了的,您的回答实际上对 OP(Web API 路由)很有帮助。最好的~
  • @AleksandrIvanov 确实非常有用!谢谢。
【解决方案2】:

只是为了澄清之前关于无法在没有 MVC 的情况下创建 Web Api 项目的答案。您绝对可以这样做并获得您想要的(仅 Web API 的应用程序):

  1. 新项目
  2. Asp.Net Web 应用程序
  3. 检查 Web API(仅限)

在完成上述操作(已经有必要的默认脚手架)并复制您的模型后,对控制器的唯一更改:

public class UserController : ApiController
{
    //Handle GET request to /api/{controller name}
    public List<User> Get()
    {
        return new List<User> { new User { Name = "Peter", Age = 41 } };
    }
}

这是一个 Web API 应用程序,因此您不需要/不需要Views

要通过浏览器调用上述内容,请浏​​览到:

http://localhost:123456/api/user

回复:

<ArrayOfUser xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/StandAloneWebApi.Models">
   <User>
      <Age>41</Age>
      <Name>Peter</Name>
   </User>
</ArrayOfUser>

它是 XML,因为我通过浏览器调用它,而不是“要求”特定响应。如果我将Accept 标头设置为application/json,我将获得 JSON。

例如使用curl

curl -H "accept: application/json" http://localhost:123456/api/user

响应(为简洁而编辑):

< HTTP/1.1 200 OK    
< Pragma: no-cache
< Content-Type: application/json; charset=utf-8
....
[{"Name":"Peter","Age":41}]

Aleksandr Ivanov 的回答中的链接将非常有帮助,并将深入了解 Web Api 如何处理/路由请求。

第...

【讨论】:

  • 谢谢,这对我很有帮助。一个问题,如果你有时间。我正在使用Visual Studio Express 2013 for web,当我在此步骤中开始Nwe project -&gt; ASP.NET Empty Web Application 时,我没有看到WebApi 的检查是Express 版本中缺少的东西还是我在步骤上缺少/犯了错误?
  • @Leron 不幸的是,我不使用/拥有 Express...不确定您是否知道 VS 2013 Community is free 可以为您提供 VS 2013 Pro 功能。
猜你喜欢
  • 2016-04-06
  • 2013-10-27
  • 2013-02-28
  • 2021-08-07
  • 2022-01-22
  • 2023-03-03
  • 2015-06-05
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多