2016-08-24 10 views
1

MapHttpRouteの概念を完全に誤解しているかもしれません。私はasp.net web apiを開発しています。ASP.Net MVC Web API複数のコントローラのMapHttpRouteは1つ以上のパラメータを取ることはありません

私はMyUserController.csとMyTaskController.csを持っています。 MyUserControllerはユーザー名/パスワードを受け取り、セッションキーを返します。これは期待通りに動作します。

しかし、MyTaskControllerは、2番目のパラメータを渡すと不平を言っています。 http://localhost:59720/api/mytask/somesessionkey -

http://localhost:59720/api/mytask/somesessionkey/1に動作します - 動作しない、次のエラーに

{ "メッセージ": "要求されたリソースは、HTTPメソッドをサポートしていません 'GET' を。"}スロー

私は方法で[HttpGet]を試してみました。

MyTaskController.cs

//works fine 
public IEnumerable<MyTask> Get(string sessionkey) 
{ 
    MyTaskModel mtm = new MyTaskModel(); 
    return mtm.GetAll(); 
} 

//doesn't work 
public string Get(string sessionkey, int id) 
{ 
    if(isValid(sessionkey)) 
    { 
     return DataAccess().GetTask(id); 
    } 
    return ""; 
} 

MyUserController.cs

public string Get(string username, string password) 
{ 
    string sessionkey = "tempsession"; 
    return sessionkey; 
} 

WebApiConfig.cs

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 
    // Configure Web API to use only bearer token authentication. 
    config.SuppressDefaultHostAuthentication(); 
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

    config.Routes.MapHttpRoute(
     name: "MyUserApi", 
     routeTemplate: "api/{controller}/{username}/{password}", 
     defaults: new { controller = "MyUser" } 
    ); 

    config.Routes.MapHttpRoute(
     name: "MyTaskApi", 
     routeTemplate: "api/Mytask/{sessionkey}/{id}", 
     defaults: new 
     { 
      controller = "MyTask", 
      id= RouteParameter.Optional 
     } 
    ); 

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

    config.Formatters.Remove(config.Formatters.XmlFormatter); 
    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/json")); 
} 

答えて

0

は、最初のルートを入れ、その中にあなたがルートを定義する順序を変更してみてくださいmytaskcontrollerに関連する:

config.Routes.MapHttpRoute(
     name: "MyTaskApi", 
     routeTemplate: "api/Mytask/{sessionkey}/{id}", 
     defaults: new 
     { 
      controller = "MyTask", 
      id= RouteParameter.Optional 
     } 
    ); 

config.Routes.MapHttpRoute(
     name: "MyUserApi", 
     routeTemplate: "api/{controller}/{username}/{password}", 
     defaults: new { controller = "MyUser" } 
    ); 
0

あなたはwebapi 2属性ルーティングで試してみることができます。

[ルート( "GetByID/{セッションID}/{ID}")]

1

私はそれがコントローラ名 "MyUserと" の代わりに "{コントローラ}" を使用して動作するようになりました。私はそれがコントローラ= "MyUser"として指定されたデフォルト値を使用すると思ったが、私はそれがなぜないか分からない。

非作業コード:

config.Routes.MapHttpRoute(
     name: "MyUserApi", 
     routeTemplate: "api/{controller}/{username}/{password}", 
     defaults: new { controller = "MyUser" } 
    ); 

の作業コード:

config.Routes.MapHttpRoute(
     name: "MyUserApi", 
     routeTemplate: "api/MyUser/{username}/{password}", 
     defaults: new { controller = "MyUser" } 
    ); 
関連する問題