【问题标题】:ASP.Net MVC Web api - MapHttpRoute for multiple controllers won't take more than 1 parameterASP.Net MVC Web api - 多个控制器的 MapHttpRoute 不会超过 1 个参数
【发布时间】:2016-08-24 18:38:05
【问题描述】:

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

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

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

http://localhost:59720/api/mytask/somesessionkey/1 - 不起作用,抛出以下错误

{"Message":"请求的资源不支持http方式 '得到'。"}

我在方法上尝试了使用和不使用 [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"));
}

【问题讨论】:

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


    【解决方案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" }
        );
    

    【讨论】:

      【解决方案2】:

      尝试改变你定义路由的顺序,先把与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" }
          );
      

      【讨论】:

        【解决方案3】:

        你可以试试 webapi 2 属性路由。

        [Route("GetByID/{SessionID}/{Id}")]

        【讨论】:

          猜你喜欢
          • 2018-08-08
          • 2012-09-24
          • 1970-01-01
          • 1970-01-01
          • 2019-05-15
          • 2015-04-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-21
          相关资源
          最近更新 更多