2016-08-24 59 views
1

我可能完全誤解了MapHttpRoute的概念。我正在開發一個asp.net web api,很難讓路由工作。ASP.Net MVC Web api - 多個控制器的MapHttpRoute不會超過1個參數

我有一個MyUserController.cs和MyTaskController.cs。 MyUserController接受用戶名/密碼並返回一個會話密鑰,它按預期工作。

但是,當我傳遞第二個參數時MyTaskController不斷抱怨。 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/{的SessionID}/{ID}」)]

1

我知道了通過使用控制器名 「MYUSER」 工作,而不是 「{}控制器」。我認爲它會使用指定爲controller =「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" } 
    ); 
相關問題