如何在同一个项目中使用MVC控制器和WebAPI控制器

本文关键字:控制器 MVC WebAPI 同一个 项目 | 更新日期: 2023-09-27 18:04:34

我试图在同一个项目中使用MVC控制器和Web API控制器,但我得到Web API的404错误。我在VS 2015中开始作为MVC项目,但随后添加了Web API控制器,并使用默认代码给出404错误。

可能的解决方案是什么?我在Stack Overflow上尝试了一些解决方案,但它们不起作用。我尝试的一个答案是这个问题的公认答案:所有ASP。Web API控制器返回404

Global.asax:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);//WEB API 1st
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

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 }
        );
    }
}

RouteConfig :

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
Web API控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using O365_APIs_Start_ASPNET_MVC.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using O365_APIs_Start_ASPNET_MVC.Helpers;
using System.Threading.Tasks;
namespace O365_APIs_Start_ASPNET_MVC.Controllers
{
    public class MAILAPIController : ApiController
    {
        private MailOperations _mailOperations = new MailOperations();
        //async Task<BackOfficeResponse<List<Country>>>
        // GET: api/MAILAPI
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        // GET: api/MAILAPI/5
        public string Get(int id)
        {
            return "value";
        }
        // POST: api/MAILAPI
        public void Post([FromBody]string value)
        {
        }
        // PUT: api/MAILAPI/5
        public void Put(int id, [FromBody]string value)
        {
        }
        // DELETE: api/MAILAPI/5
        public void Delete(int id)
        {
        }
    }
}

在相同的解决方案中恢复NuGet包时也出现错误:

尝试还原包时发生错误:指定的路径、文件名或两者都太长。全限定文件名长度小于260个字符,目录名长度小于248个字符。

如何在同一个项目中使用MVC控制器和WebAPI控制器

你需要在为MVC注册路由之前注册web api 的路由,所以基本上你的App_Start()函数应该是这样的:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);//WEB API 1st
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);//MVC 2nd
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

您可以像这样在同一个文件中编写这两个配置:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index",
                id = UrlParameter.Optional }
        );
    }
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

在全局。如:

protected void Application_Start()
{
   AreaRegistration.RegisterAllAreas();
   GlobalConfiguration.Configure(RouteConfig.Register); // WEB API 1st
   FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
   RouteConfig.RegisterRoutes(RouteTable.Routes); // MVC 2nd
   BundleConfig.RegisterBundles(BundleTable.Bundles);
} 

只需在Global.asax的Application_Start()方法中添加一行:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);   // This line you need to add
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

你有两个相同的路由映射。移除delete(id)或get(id)。或者,你也可以在路由映射中添加动作。