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

C# 如何将多个参数传递给WebAPI?,c#,asp.net-web-api,asp.net-routing,C#,Asp.net Web Api,Asp.net Routing,我有以下网址: http://localhost/api/values/100/some+string+here 在WebAPI应用程序ValuesController中,我有以下内容: [HttpGet] [Route("api/values/{p1}/{p2}")] public HttpResponseMessage Get (string p1, string p2) { ... } 对于调用方来说,它永远不会访问web api。相反,它回来了404 知道怎么回事吗?您正在使用。确保

我有以下网址:

http://localhost/api/values/100/some+string+here
在WebAPI应用程序
ValuesController
中,我有以下内容:

[HttpGet]
[Route("api/values/{p1}/{p2}")]
public HttpResponseMessage Get (string p1, string p2) {
...
}
对于调用方来说,它永远不会访问web api。相反,它回来了404

知道怎么回事吗?

您正在使用。确保将web 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);
        }
    }
}

它可能与
值有关。尝试用适当的大小写控制器名称替换此名称,如
Home
(如果您的ApicController名为
HomeController
)。可能值得检查一下,我无法重复您的问题。我尝试过使用最新版本的Web API 2.2。我使用了各种Web API控制器名称和您发布的完全相同的URI和方法,它每次都会被值击中。要检查的东西。确保您定义的类是从
ApiController
继承的(而不是从Controller继承的)。在webapiconfig.cs中发布默认路由配置。请确保您的WebApiConfig.cs在启动时已初始化。@Igor URL路由不区分大小写,因此我怀疑这是问题所在。这可能是个愚蠢的问题,但您返回的是HttpResponseMessage。你确定api永远不会被击中吗?您是否检查过您的方法没有执行以下操作:返回新的HttpResponseMessage(HttpStatusCode.NotFound);除了Forthe RoutePrefex,您提到的所有内容都是在WebAPI应用程序中自动生成的。不总是这样。取决于您正在使用的visual studio版本。第一个参数是字符串。我更新了OP。我使用的URL是错误的。请查看新的URL。加号而不是连字符。确定现在创建集成测试以确认