如何托管WebApi仅用于处理'MVC`项目的请求

时间:2015-04-26 22:01:29

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

对于这个新项目,我们决定使用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解决方案。创建解决方案后,我从WebApi 2安装了Nuget,因此我的项目结构非常基本。我手动创建了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项目,我想一切都会正常工作,但是那时doint的全部内容都缺失了。我希望能够独立于MVC解决方案托管WebApi,甚至是物理上的,只发送和接听电话。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只是为了澄清之前的答案,即没有MVC就无法创建Web Api项目。你绝对可以做到并获得你想要的东西(仅限Web API的应用程序):

  1. 新项目
  2. Asp.Net Web Application
  3. 检查Web API(仅限)
  4. 执行上述操作(已经具有必要的默认支架)并复制模型后,对控制器的唯一更改是:

    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。

    e.g。使用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如何处理/路由请求。

    ... H个