web-dev-qa-db-ja.com

WebAPIコントローラーに移動できないのはなぜですか

モバイルアプリをWebAPIに接続するために初めてWebAPIを使用します。
MVC 5プロジェクトがあり、APIフォルダーを作成し、その中にProductsControllerを作成しました。

_namespace DDD.WebUI.API
{
    public class ProductsController : ApiController
    {
        public string GetAllProducts()
        {
            return "Hello From WebAPI";
        }

    }
}
_

そして、私はブラウザからこのメソッドにアクセスしようとしました:

_http://localhost:21879/DDD.WebUI/API/products/GetAllProducts
_

しかし、私は404を取得します。
それはおそらく愚かなことですが、それを理解することはできません:(
[〜#〜] update [〜#〜]

_public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
               name: "DefaultApi",
               url: "API/{controller}/{action}/{id}",
               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
           );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );



        }
_

更新2
少し進歩しています:Application_Start()を更新しました:

_GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
_

WebApiConfigにあります:

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

私はまだAPIコントローラーをProject/Api/ProductsControllerに保存していますが、今はアクセスできますが、それでも値を取得できません。

_http://localhost:21879/api/products/getallproducts
_

しかし、私が得るエラーは次のとおりです。

_<Error>
<Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'GSL.WebUI.Api.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>
_
8
1110

あなたのアップデートを見ると、あなたのアクションにはidが必要だと思います。これはnull許容でないintであり、http://localhost:21879/API/products/GetAllProducts/2ここで'2'が割り当てられているのでURLを変更するだけです。 'id'に移動すると機能します。

WebApiConfigで、ルートを次のように変更します。

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

このMvcルートを変更するだけです:

    routes. MapRoute(
           name: "DefaultApi" ,
           url: "API/{controller}/{action}/{id}" ,
           defaults: new { controller = "Home" , action = "Index" , id = UrlParameter .Option
       );

これとともに :

     routes. MapRoute(
           name: "DefaultApiMvc" ,
           url: "APIMvc/{controller}/{action}/{id}" ,
           defaults: new { controller = "Home" , action = "Index" , id = UrlParameter .Option
       );

そうしないと、MvcルートとApiルートが互いに競合するためです。

1

私も同じ問題を抱えていました。 Global.asax.csにルートを登録する順序に注意してください。

これは機能します:

GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

これはしません:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
7
Kevin

この方法でルーティングを使用する場合は、アクションで許可されるHttpメソッドを指定する必要があります。

public class ProductsController : ApiController
{
    [HttpGet]
    public string GetAllProducts()
    {
        return "Hello From WebAPI";
    }
}

APIルーティングに関するすべての情報は次のリンクから入手できます: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web -api

4
Tallmaris