1

MVC 3 Web API でのルーティングに関する問題と戦っています。それはかなり単純なはずですが、私は前進していません。

私のエラーは次のとおりです。

  <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 'Boolean NewViolationsPublished(Int32)' in 'BPA.API.Controllers.CacheManagementController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
       </MessageDetail>
   </Error>

私のRegisterRoutesはそのようなものです:

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

            routes.MapHttpRoute(
              name: "NukeAllItemsFromCache",
              routeTemplate: "api/CacheManagement/NukeAllItemsFromCache");


            routes.MapHttpRoute(
                 name: "ControllerAndAction",
             routeTemplate: "api/{controller}/{action}"
             );

            routes.MapHttpRoute(
                 name: "ControllerAndActionAndId",
                 routeTemplate: "api/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional, action = "Get" },
              constraints: new { id = @"^\d+$" } // Only integers 
             );

            routes.MapHttpRoute(
                name: "ControllerAndId",
                routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional },
          constraints: new { id = @"^\d+$" } // Only integers 
            );
        }

そして私のコントローラーは(読みやすくするためにコードを取り出しました):

 public class CacheManagementController : ApiController
    {
        public CacheManagementController()        

        [HttpGet]
        public bool NewViolationsPublished(int id)

        [HttpGet]
        public bool IsCached(CachedItemLabels label, int clientId)

        [HttpGet]
        public void RemoveItemFromCache(int clientId, CachedItemLabels cacheLabel, string test)

        [HttpGet]
        public string NukeAllItemsFromCache()    
    }

電話しようとするとエラーが発生します:

http://localhost/api/CacheManagement/NukeAllItemsFromCache

ティア

4

5 に答える 5

5

正しい場所でルートを定義していますか? Web API ルートは、 http: //www.asp.net/web-api/overview に示されているように、System.Web.Http.GlobalConfiguration.Configuration.Routes.MapHttpRoute (通常は App_Start の WebApiConfig.cs ファイル内) を使用して構成する必要があります。 /extensibility/configuring-aspnet-web-api。バニラ MVC で使用されるルート構成とは異なります。

ID はオプションで、api/{controller}/{id} であるデフォルトの Web API ルートにアクセスしているだけかもしれません。アクションは HTTP 動詞 (この場合は GET) によって決定され、すべてのメソッドは [HttpGet] によってそれに一致します。

編集:例

Global.asax

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        GlobalModifiers.ApplyGlobalConfiguration(this, true);
    }

WebApiConfig.cs

public static class WebApiConfig
{
   public static void Register(HttpConfiguration config)
   {
        config.Routes.MapHttpRoute(
            name: "action-specific",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
    );
}
于 2013-04-11T19:44:23.470 に答える
0

コントローラーが Controller ではなく ApiController を拡張していることを再確認してください

 public class CacheManagementController : ApiController

それよりも

 public class CacheManagementController : Controller
于 2015-02-10T16:56:42.753 に答える
0

私はあなたの問題がこのルートにあると信じています:

routes.MapHttpRoute(
  name: "ControllerAndActionAndId",
  routeTemplate: "api/{controller}/{action}/{id}",
  defaults: new { id = RouteParameter.Optional, action = "Get" },
  constraints: new { id = @"^\d+$" } // Only integers 
);

オプションのパラメーターとして指定するidと同時に、実際には null 非許容の数値になるように制約します。が例外の場合/api/CacheManagement/NukeAllItemsFromCacheは、追加のルートを追加します。それ以外の場合は、@"^\d*$"可能であれば制約を緩和します。

于 2013-04-11T19:19:28.000 に答える