ASP.Net MVC Web api - 多个控制器的MapHttpRoute不会超过1个参数

时间:2016-08-24 18:38:06

标签: asp.net-web-api asp.net-web-api2

我可能完全误解了MapHttpRoute的概念。我正在开发一个asp.net web api,很难让路由工作。

我有一个MyUserController.cs和MyTaskController.cs。 MyUserController接受用户名/密码并返回一个sessionkey,它按预期工作。

但是当我传递第二个参数时,MyTaskController一直在抱怨。 http://localhost:59720/api/mytask/somesessionkey - 作品

http://localhost:59720/api/mytask/somesessionkey/1 - 无法正常工作,会引发以下错误

  

{" Message":"请求的资源不支持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"));
}

3 个答案:

答案 0 :(得分:1)

我通过使用控制器名称“MyUser”而不是“{controller}”来使用它。我以为它会使用指定为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" }
    );

答案 1 :(得分: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" }
    );

答案 2 :(得分:0)

您可以尝试使用webapi 2属性路由。

〔路线( “GetByID / {的SessionID} / {ID}”)]