【问题标题】:How to Use MVC Controller and WebAPI Controller in same project如何在同一个项目中使用 MVC 控制器和 WebAPI 控制器
【发布时间】:2017-01-05 04:24:43
【问题描述】:

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

可能的解决方案是什么?我在 Stack Overflow 上尝试了一些解决方案,但没有奏效。我试过的一个是这个问题的公认答案:All ASP.NET Web API controllers return 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 个字符。

【问题讨论】:

  • 您尝试调用的控制器是什么样的?
  • 你在哪里打电话给WebApiConfig.Register
  • @MitchelSellers 将添加控制器代码
  • @Richard 将在调用寄存器的地方添加文件代码
  • @Richard 我尝试添加它,但是当我添加这一行时 ----GlobalConfiguration.Configure(WebApiConfig.Register);---- 在 application_start 项目中的 Registerallareas 给出 404 运行时错误之后。通过删除提到的行,我可以运行 mvc cotroller 但不能运行 webapi 控制器并添加行为两个控制器提供运行时 404

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


【解决方案1】:

只需在 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);
}

【讨论】:

    【解决方案2】:

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

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

    在 Global.aspx 文件中,像这样编辑您的代码:

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

    【讨论】:

      【解决方案3】:

      您有两条路线以相同的方式映射。删除 delete(id) 或 get(id)。或者,您可以在路线映射中添加操作。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 对不起,它不工作。实际上,如果您在有问题的 cmets 中看到我的第 5 条评论,我已经尝试过。我在那里提到我已将这行代码放在 RegisterAllAreas() 之后。我现在也更新了问题代码
        • 你确定你正确调用了你的 api 控制器吗?因为它在我这边工作得很好。尝试调用这个 url 但显然用你的端口号替换我的端口号 - localhost:37294/api/MAILAPI
        • 谢谢我犯了一些愚蠢的错误。这也可能是由于 nuget 错误解决后的 nuget restore 它就像一个魅力
        • 大家好,我的 MVC 解决方案中的 API 元素可以正常工作,但默认情况下它尝试将解决方案作为 API 解决方案运行。但我希望它作为默认的 MVC 解决方案运行,然后如果您转到 API 位置等,运行 API .. 有没有其他人遇到过这个问题并且能够解决它?谢谢
        • 效果很好,谢谢!你介意解释一下为什么我们必须在 mvc 路由之前注册 web api 路由吗?
        猜你喜欢
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多