RoutePrefix, отличный от имени контроллера, не работает - PullRequest
0 голосов
/ 11 ноября 2018

В моем файле 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

Может кто-нибудь помочь мне узнать, как сопоставить CustomerController так, как я хочу использовать [RoutePrefix].

Большое спасибо.

1 Ответ

0 голосов
/ 11 ноября 2018

Проблема не в том, что RoutePrefix отличается от имени вашего контроллера (вы можете установить RoutePrefix("abcdefg"), если хотите), а в том, что вы указали location, customerName, phoneNumber и email как необходимые пути в вашем 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 и строк запроса: В чем разница между параметрами URL и строками запроса?

...