3

伟大的,

我的 asp.net mvc4 研究项目有问题。我尝试创建具有多个 get 操作的 apicontroller,其中一些带有参数,而另一些则没有。

我的 API

public class ContentController : ApiController
{
    [System.Web.Http.HttpGet]
    public HttpResponseMessage Categories1()
    {
        return Request.CreateResponse(HttpStatusCode.OK, new string[] { "Toys", "Games", "Animals", "Woob-Woob" }, Configuration.Formatters.JsonFormatter);
    }

    [System.Web.Http.HttpGet]
    public HttpResponseMessage Categories2()
    {
        return Request.CreateResponse(HttpStatusCode.OK, new string[] { "Toys", "Games", "Animals", "Woob-Woob" }, Configuration.Formatters.JsonFormatter);
    }

    [System.Web.Http.HttpGet]
    public HttpResponseMessage Categories3(int i)
    {
        return Request.CreateResponse(HttpStatusCode.OK, new string[] { "Toys", "Games", "Animals", "Woob-Woob" }, Configuration.Formatters.JsonFormatter);
    }

    [System.Web.Http.HttpGet]
    public HttpResponseMessage Categories4(int i)
    {
        return Request.CreateResponse(HttpStatusCode.OK, new string[] { "Toys", "Games", "Animals", "Woob-Woob" }, Configuration.Formatters.JsonFormatter);
    }
}

我的 apiConfig:

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "ApiByActionWithId",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "ApiByAction",
            routeTemplate: "api/{controller}/{action}"
        );

        config.Routes.MapHttpRoute(
            name: "ApiByName",
            routeTemplate: "api/{controller}/{action}/{name}",
            defaults: null
        );

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

以及这个结果

对于 /api/content/categories1,结果是 ["Toys","Games","Animals","Woob-Woob"]

对于 /api/content/categories3 和 /api/content/categories3/1 结果 - “未找到与请求 URI 'http://localhost:51200/api/content/categories3' 匹配的 HTTP 资源。”

我不知道应该如何处理

4

1 回答 1

1

我认为它失败是因为 api 操作中的参数名称与路由中的参数名称不匹配。

更改您的第一条路线:

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

到以下:

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

看看这是否有效。

一般来说,更具体的路线应该在 Register 方法的顶部。更通用的路线在底部作为包罗万象。

考虑如下控制器:

public class UserSettingsController : ApiController
{
    [HttpGet]
    public HttpResponseMessage GetAll();
    [HttpGet]
    public HttpResponseMessage Get(string key);
    [HttpGet]
    public HttpResponseMessage Set(string key, string value);
    [HttpGet]
    public HttpResponseMessage Restore(string key);
}

要设置路线,它需要以下路线。请注意,它们是有序的,因此如果 api 调用上没有键,则将命中 GetAll 方法。如果切换了前 2 个路由,则永远不会命中 GetAll 版本,因为对 /api/settings 的调用将转到 Get 方法,并且键只会设置为 null。

        config.Routes.MapHttpRoute(
              name: "user/settings",
              routeTemplate: "user/settings",
              defaults: new { controller = "UserSettings", action = "GetAll" },
              constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
        );

        config.Routes.MapHttpRoute(
              name: "user/settings/{key} (get)",
              routeTemplate: "user/settings/{key}",
              defaults: new { controller = "UserSettings", action = "Get" },
              constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
        );

        config.Routes.MapHttpRoute(
              name: "user/settings/{key} (set)",
              routeTemplate: "user/settings/{key}",
              defaults: new { controller = "UserSettings", action = "Set" },
              constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) }
        );

        config.Routes.MapHttpRoute(
              name: "user/settings/{key}/restore",
              routeTemplate: "user/settings/{key}/restore",
              defaults: new { controller = "UserSettings", action = "Restore" },
              constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
        );
于 2013-04-17T17:57:48.667 回答