Не удается получить ответ от веб-API ASP.NET - PullRequest
0 голосов
/ 13 февраля 2019

Я настраиваю веб-API ASP.net, но продолжаю получать 404 со всех маршрутов Http.

Это выполняется на http://localhost:52011/, поскольку это местоположение по умолчанию, которое использует VS2013,Я добавил простой тест HttpRoute, который просто возвращает строку, если она вызывается с GET для проверки возможности подключения.

Просмотр каталогов включен для обратной связи о том, что веб-API на самом деле находится на localhost, и все каталогипроект виден.

Я попытался установить имя контроллера, фиксированное в маршрутах в WebApiConfig.cs, и много читал об отображениях HttpRoute, но я продолжаю получать либо 404, либо "Тип не найден, чтосоответствует контроллеру с именем controllername".

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

Любые советы приветствуются!

WebApiConfig.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace BadgePrinter
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {            
            config.MapHttpAttributeRoutes();
            //route to print badge.
            config.Routes.MapHttpRoute(
                name: "apiPrint",
                routeTemplate: "api/{controller}/{action}/{Bedrijf}/{Aanspreektitel}/{Voornaam}/{Achternaam}/{Jobtitle}/{Kopies}/{Rijksregisternummer}/{BadgeAfdruk}/{printer}/{Image}",
                defaults: new { Image = RouteParameter.Optional}
            );
            //test route to get string back
            config.Routes.MapHttpRoute(
                name: "apiTest",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

BadgeController.cs (единственный контроллер в проекте)

Первый метод - тот, который я собираюсь использовать в конечном итоге, ноtestmethod - это тот, который я использую для тестирования.

using BadgePrinter.CardTemplates;
using BadgePrinter.Interfaces;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

namespace BadgePrinter.Controllers
{
    public class BadgeController : ApiController
    {     
        //removed the first method since it was big and distracting.
        // test method
        [HttpGet]
        public IHttpActionResult GetAllProducts()
        {
            return Ok("some product");
        }
    }
}

ссылка для тестового метода, который я использую: http://localhost:52011/api/BadgeController/Products/1

Я также пробовал эту ссылку, хотя это не должно иметь значения: http://localhost:52011/api/BadgeController/Products/1

Результат:

{
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:52011/api/BadgeController/Products/1'.",
    "MessageDetail": "No type was found that matches the controller named 'BadgeController.cs'."
}

Для другого HttpRoute я продолжаю получать 404, но я буду в раю, если смогу заставить тест работать :) PS: я новичок втакого рода вещи (ASP.net и API), поэтому извините, если я идиот.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

У вас есть 2 проблемы:

1) Имя вашего контроллера BadgeController, но в вашем API это должно быть только Badge.Правильный URL-адрес должен быть:

http://localhost:52011/api/Badge/xxx

2) Я не вижу имя метода Products или что-то подобное в вашем коде.

3) Если это POSTметод, он должен иметь [FromBody] на входе параметра.

0 голосов
/ 13 февраля 2019

Есть некоторые проблемы с вашим URL:

http://localhost:52011/api/BadgeController/Products/1 

Насколько я вижу, у вас нет метода GET, который бы сопоставлялся с параметром ID.Все, что у вас есть в вашем контроллере, это

[HttpGet]
public IHttpActionResult GetAllProducts()

, который не принимает никаких входных данных.

2) Документированное соглашение Web API состоит в том, что вы не пишете «Controller» явно вURL.В этом случае требуется только первая часть, которая является уникальной для контроллера (Badge).

3) Я не могу видеть, откуда вы получаете часть "Продукты" URL-адреса.Там нет пользовательского определения маршрута или атрибута, который сделал бы эту часть маршрута.Опять же, соглашение заключается в том, что вы определяете метод действия, имя которого начинается с «Get» и который сопоставляется с запросом GET с именем контроллера, без каких-либо дополнительных фрагментов в конце.Остальная часть имени метода не имеет значения - и в вашем случае AllProducts не совпадает с /Products в любом случае ... так что даже если бы это было необходимо, оно все равно было бы неверным.

В заключение,правильный URL-адрес для доступа к вашему действию GET должен быть следующим:

http://localhost:52011/api/Badge/

Примечание: если вам нужно либо изменить существующий метод GetAllProducts, либо добавить второй метод, подобный этому:

[HttpGet]
public IHttpActionResult Get(int id)
{
  return Ok("Product" + id);
}

Затем вы можете использовать идентификатор в своем URL, например,

http://localhost:52011/api/Badge/1

, и он должен перенаправить на этот метод.

0 голосов
/ 13 февраля 2019

Попробуйте сбросить часть URL контроллера:

http://localhost:52011/api/Badge/Products/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...