如何将多个参数传递给 WebAPI?

How to pass multiple params to WebAPI?

我有以下 URL:

http://localhost/api/values/100/some+string+here

在 WebAPI 应用程序 ValuesController 中,我有这个:

[HttpGet]
[Route("api/values/{p1}/{p2}")]
public HttpResponseMessage Get (string p1, string p2) {
...
}

对于调用者,它永远不会访问网络 api。相反,它返回 404。

知道哪里出了问题吗?

您正在使用 Attribute Routing in ASP.NET Web API 2。确保将您的网站 api 配置为使用 MapHttpAttributeRoutes.

的属性路由
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

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

接下来确保您正确定义了控制器

public class ValuesController : ApiController {
    //GET api/values/100/some-string-here
    [HttpGet]
    [Route("api/values/{p1}/{p2}")]
    public HttpResponseMessage Get (string p1, string p2) {
    ...
    }
}

你甚至可以使用 RoutePrefix

[RoutePrefix("api/values")]
public class ValuesController : ApiController {
    //GET api/values/100/some-string-here
    [HttpGet]
    [Route("{p1}/{p2}")]
    public HttpResponseMessage Get (string p1, string p2) {
    ...
    }
}

此外,如果您希望第一个参数是整数,就像在您的示例中一样。然后你可以使用路由约束和更新方法。

[RoutePrefix("api/values")]
public class ValuesController : ApiController {
    //GET api/values/100/some-string-here
    [HttpGet]
    [Route("{p1:int}/{p2}")]
    public HttpResponseMessage Get (int p1, string p2) {
    ...
    }
}

更新:

为 Values Controller 创建了集成测试并能够确认操作已被调用

[TestMethod]
public async Task HttpClient_Should_Get_OKStatus_From_Action_With_Multiple_Parameters() {
    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();

    using (var server = new HttpServer(config)) {

        var client = new HttpClient(server);

        string url = "http://localhost/api/values/100/some+string+here";

        using (var response = await client.GetAsync(url)) {
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
    }
}