При подключении к конечным точкам (маршрутам) WebAPI2 генерируется Http-код 503 для контроллера, а другой контроллер работает нормально. - PullRequest
0 голосов
/ 16 мая 2019

Я использую хостинг Owin с WebAPI2. У меня есть два класса контроллера и с использованием атрибутов маршрутизации. Один из них имеет следующую подпись:

    [RoutePrefix("api/v1/devices")]
    public class DeviceController : ApiController
    {

        [HttpPost]
        [Route("")]
        public async Task<HttpResponseMessage> DevicePresence()
        {
           ...
        }

        [HttpGet]
        [Route("updates/{deviceID}")]
        public HttpResponseMessage GetDeviceUpdates(string deviceID)
        {
            ...
        }
    }

Этот работает нормально, и срабатывают методы действия.

Другой Контроллер имеет нижнюю подпись:

    [RoutePrefix("device/class")]
    public class RemoteController : ApiController
    {
        [HttpGet]
        [Route("remotehost")]
        public HttpResponseMessage RemoteHost()
        {
            ...
        }

        [HttpGet]
        [Route("version")]
        public HttpResponseMessage GetVersion()
        {
            ...
        }
     }

Когда я пытаюсь подключиться к любому из них, я получаю ответ 503 (Служба недоступна).

Мой класс запуска запускается как показано ниже:

    public class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.Formatters.Add(new JsonMediaTypeFormatter());
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
    }

Я также пытался использовать обычную маршрутизацию, но проблема все еще та же.

config.Routes.MapHttpRoute(
                name: "RemoteApi",
                routeTemplate: "device/{controller}/{action}"
            );

public class ClassController : ApiController
{
       public HttpResponseMessage GetVersion()
        {
            ...
        }
}

Это также выбрасывает код состояния 503 Если я изменю префикс Route во втором контроллере, как показано ниже, он будет работать:

[RoutePrefix("api/v1/device/class")]
    public class RemoteController : ApiController
    {
      ...
    }

Согласно моему требованию, я не мог изменить конечные точки.

Я не уверен, что здесь не так, и любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Я понял, что это не проблема с webapi или маршрутизацией.На самом деле, я добавлял исключение брандмауэра для URL-адресов, и почему-то оно не удалялось из настроек брандмауэра и сохраняет запись в DACL.Я удалил это из командной строки, и теперь все работает нормально.

Извините за беспокойство ...

0 голосов
/ 16 мая 2019

Ваш RemoteController вызывает исключение, поскольку вы не соблюдаете соглашения по присвоению имен WEB API.Ваш RemoteHost () метод, который является методом get, должен иметь префикс «Get», поэтому его имя на самом деле должно быть GetRemoteHost () .Это должно решить это.

Если вы хотите изменить соглашения об именах, вы можете изменить определения маршрутов в файле global.asax:

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

Надеюсь, что это помогло.

...