web-dev-qa-db-ja.com

同じプロジェクトでMVCコントローラーとWeb APIコントローラーを使用する方法

同じプロジェクトでMVCコントローラーとWebAPIコントローラーを使用しようとしていますが、webapiで404エラーが発生しました。私は2015年にMVCプロジェクトとしてプロジェクトを開始しましたが、webapiコントロールを追加し、デフォルトコードで404エラーが発生しています

何が可能な解決策になる可能性があります。 Stackoverflowでいくつかのソリューションを試しましたが、それらは機能しませんでした。そのうちの1つはリンクの下にあります(そこにある回答を受け入れました) すべてのASP.NET Web APIコントローラーは404を返します

Global.ASAX File Code:

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

        }

WEBAPI.CONFIG FILE

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

        }
    }

ルート構成ファイルのコード

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

        }
    }

WebAPI Controller CODE

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 Restoreエラーを取得Error Nuget failed to restore PNG

16
user3177519

Web APIのルーティングを登録する必要があります[〜#〜] before [〜#〜] 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);
}
25
Denys Wessels

グローバルasaxページのApplication_Start()メソッドに1行追加するだけです。

enter image description here

1

同じ方法でマッピングされた2つのルートがあります。 delete(id)またはget(id)を削除します。または、ルートマッピングにアクションを追加できます。

0
sharad shrestha

このように両方の設定を同じファイルに書き込むことができます

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