モバイルアプリを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>
_
あなたのアップデートを見ると、あなたのアクションには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ルートが互いに競合するためです。
私も同じ問題を抱えていました。 Global.asax.csにルートを登録する順序に注意してください。
これは機能します:
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
これはしません:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
この方法でルーティングを使用する場合は、アクションで許可される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