与控制器名称不同的 RoutePrefix 不起作用

RoutePrefix different than Controller name doesn't work

在我的 WebApiConfig.cs 文件中我有:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

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

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

我有一个 OrderController

[RoutePrefix("api/Orders")]
public class OrderController : ApiController
{
    [Authorize]
    [Route("")]
    public IHttpActionResult Get()
    {
        return Ok(Order.CreateOrders());
    }

正如预期的那样,上面的代码适用于 url - http://localhost:15660/api/Orders

我有另一个 CustomerController :

[Authorize]
[RoutePrefix("api/Customers")]
public class CustomerController : ApiController
{
    // GET api/customers/search
    [HttpGet]
    [Route("search/{location}/{customerName}/{phoneNumber}/{email}")]
    public IHttpActionResult SearchCustomers(string location = null, string customerName = null, string phoneNumber = null, string email = null)
    {
        return Ok(GetCustomersSearchResults(location, customerName, phoneNumber, email));
    }

在这里,我想调用 /api/Customers/search - 但是这给出了找不到匹配控制器名称的错误。如果我将前缀重命名为

[RoutePrefix("api/Customer")]

然后它工作得很好。

在 Ordercontroller 中,api/Orders 工作得很好。在 CustomerController 中,为什么 api/customers 根本不起作用并给出错误。我在谷歌上搜索了很多,发现语法是正确的,但不知道我哪里出错了限制 CustomerController 与 /api/Customers/search

映射

任何人都可以帮助我知道如何使用 [RoutePrefix] 以我想要的方式映射 CustomerController。

非常感谢。

问题不是 RoutePrefix 与您的控制器名称不同(如果需要,您可以设置 RoutePrefix("abcdefg")),而是您指定了 locationcustomerNamephoneNumberemail 作为 URL 中的必需路径,因此只有像这样的 URL 才能在您当前的设置中工作:/api/Customers/search/EU/cust1/1234/email.

您可能需要的是查询字符串,而不是 URL 中的值。例如:/api/Customers/search?location=EU&customerName=cust1&phoneNumber=123。因此,只需将您的路线更改为 [Route("search")] 这样 URL 就可以了!

试图通过 URL 传递多个可选值是行不通的,如果你传递一个 URL 会怎样,比如 api/Customers/search/value。服务器如何知道 value 应该是 location 还是 customerName?

这是一个关于 URL 参数和查询字符串的问题:What is the difference between URL parameters and query strings?