ASP.net WebAPI выдает ошибку Access-Control-Allow-Origin после вставки нового метода - PullRequest
0 голосов
/ 24 октября 2018

Я шел через учебник по угловым героям и хотел заменить службу в памяти реальным бэкэндом.Я хотел создать ASP.net WebAPI.Контроллер работал совершенно нормально, как это с моим угловым интерфейсом:

[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]
public class HeroesController : ApiController
{
    private static readonly List<Hero> heroes;

    static HeroesController()
    {
        heroes = new List<Hero>()
        {
            new Hero { id = 11, name = "Mr. Nice" },
            new Hero { id = 12, name = "Narco" }
       };
    }

    public IEnumerable<Hero> Get()
    {
        return heroes;
    }

    public Hero Get(int id)
    {
        return heroes.Find(x => x.id == id);
    }

    public Hero Post([FromBody] Hero hero)
    {
        hero.id = heroes.Max(x => x.id) + 1;
        heroes.Add(hero);
        return hero;
    }

    public void Put([FromBody] Hero hero)
    {
        Hero oldHero = heroes.FirstOrDefault(x => x.id == hero.id);
        if (oldHero != null)
        {
            heroes.Remove(oldHero);
            heroes.Add(hero);
        }
    }
    public void Delete(int id)
    {
        Hero oldHero = heroes.FirstOrDefault(x => x.id == id);
        if (oldHero != null)
        {
            heroes.Remove(oldHero);
        }
    }
}

Это было здорово и круто, пока я не попытался создать метод, который не был назван как "get", "post", "put" или"удалять".Я думал, что мог бы вставить другой публичный метод, подобный этому:

    public void DoSomething()
    {
    }

С этого момента каждый метод продолжал работать, КРОМЕ поста.Когда я хотел вызвать сообщение, я получил следующие сообщения:

ОПЦИИ http://localhost:52835/api/heroes 500 (Внутренняя ошибка сервера)

Не удалось загрузить http://localhost:52835/api/heroes:Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin».Источник 'http://localhost:4200', следовательно, запрещен доступ.

ОШИБКА TypeError: Невозможно прочитать свойство' id 'из неопределенного

ОШИБКА КОНТЕКСТА DebugContext_ {view: {…}, nodeIndex: 2, nodeDef: {…}, elDef: {…}, elView: {…}}

Да, угловой интерфейс работает на порте 4200 и webapi на 52835. Поэтому я установил и активировал CORSкоторый работает очень хорошо, пока я не добавил упомянутый пустой метод.Если я изменю метод на приватный, все снова будет работать нормально.Я не понимаюПожалуйста, помогите мне: (

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Простое добавление метода Http, например

[HttpPost]
public void DoSomething()

, не сработало для меня.Метод был HttpPost по умолчанию (как вы можете прочитать в первой ссылке ниже).И когда я перешел на HttpGet, мои методы get перестали работать.Похоже, на заднем плане есть какая-то черная магия, которая пытается выяснить, какие методы могут соответствовать типу http-запросов в зависимости от имени и сигнатуры метода.И если я правильно понял, сложные типы (например, мой герой) проверяться не будут, поэтому в основном сигнатуры моих методов «Post» и «DoSomething» равны.Для этого прочитайте справочную ссылку ADyson:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/routing-and-action-selection#action-selection

Если подходит более одного метода, черная магия начинает выпрыгивать из окна.С этим сказал, что поможет изменение сигнатуры метода (конечно).Например, добавив параметр типа int.

Но я думаю, что лучшим решением было бы определение маршрута с аннотацией маршрута следующим образом:

[Route("heroes/doSomething")] 
public void DoSomething()

Опять же благодаря ADyson (вымой герой;)):

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

Редактировать:

Конечно, это не черная магия.Когда я прочитал связанные страницы, все стало ясно.Логика в том, что методы, которые содержат Post в именах своих, будут обслуживать запросы post.И если автоматизм не может извлечь тип запроса из имени метода, то метод автоматически отправляется.И если теперь два метода обслуживают почтовые запросы, автоматизм сбивается с толку, если не заданы четкие маршруты.

0 голосов
/ 25 октября 2018

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

Например

[HttpPost]
public void DoSomething()
{
} 
...