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

时间:2018-11-11 04:14:09

标签: c# asp.net-web-api2

在我的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根本不起作用并给出错误。我在Google上搜索了很多,发现语法是正确的,但无法确定我在哪里出了错,这限制了CustomerController使用/api/Customers/search

进行映射

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

问题不是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传递多个可选值的操作将不起作用,如果传递诸如api/Customers/search/value之类的URL会怎样。服务器将如何知道value应该是location还是customerName?

这里是有关网址参数和查询字符串的问题:What is the difference between URL parameters and query strings?

相关问题