Почему отправка запроса PUT в виде обычного текста не принимается ASP.NET Core? - PullRequest
2 голосов
/ 27 апреля 2019

Я пытаюсь отправить запрос PUT, содержащий строку.

Запрос отправляется от клиента, который находится в Angular, на сервер, который является ASP.NET Core Controller.Заголовок запроса: text/plain.

Чтобы ASP.NET Core принял text/plain, я должен был следовать этому учебнику, который работает, только если я отправляю запрос почтальону:
image Когда я пытаюсь отправить один и тот же запрос от клиента к серверу, он не работает, запрос, а не событие, запускает точку торможения из RawRequestBodyFormatter класса.

Угловая служба:

export class LendedBookService {
  private baseUrl: string;

  constructor(private httpClient: HttpClient) {
    this.baseUrl = 'http://localhost:55152/';
  }

  public sendReminder(lendedBookId: string): Observable<any> {
    var headers = new HttpHeaders({'Content-Type': 'text/plain; charset=utf-8'});
    return this.httpClient.put<string>(this.baseUrl + 'api/lendedBook/sendReminder', lendedBookId, {
      headers: headers
    });
  }
}

Основной контроллер ASP.NET:

[Route("api/[controller]/[action]")]
[ApiController]
public class LendedBookController : ControllerBase
{
    private readonly Libranian libranian;

    public LendedBookController(Libranian libranian)
    {
        this.libranian = libranian;
    }

    [HttpPut]
    public async Task<IAsyncResult> SendReminder([FromBody]string lendedBookId)
    {
        using (var unitOfWork = UnitOfWorkLocator.GetUnitOfWork())
        {
            if (await libranian.NotifyToReturnLend(new Guid(lendedBookId)))
            {
                return Task.Run(() => NoContent());
            }

            return Task.Run(() => StatusCode(500));
        }
    }
}

Что мне делать или что я сделал неправильно, отправив запрос text/plain в этом случае?
Спасибо!

1 Ответ

2 голосов
/ 27 апреля 2019

одна причина может быть:

Cross-Origin Resource Sharing (CORS) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузеру, что веб-приложение, работающее в одном источнике (домене), имеет разрешение на доступ к выбранным ресурсам с сервера в другом источнике. Веб-приложение выполняет HTTP-запрос перекрестного источника, когда оно запрашивает ресурс, источник которого отличается (домен, протокол и порт) от своего собственного источника.

Пример запроса с несколькими источниками. Код внешнего интерфейса JavaScript для веб-приложения, обслуживаемого http://domain -a.com , использует XMLHttpRequest для выполнения запроса на http://api.domain -b. .com / data.json .

По соображениям безопасности браузеры ограничивают перекрестные HTTP-запросы, инициируемые из сценариев. Например, XMLHttpRequest и Fetch API следуют политике одного источника. Это означает, что веб-приложение, использующее эти API-интерфейсы, может запрашивать только ресурсы HTTP из того же источника, из которого было загружено приложение, если только ответ другого источника не содержит правильных заголовков CORS.

исх

Переход на .NET Core: поддерживает ли .NET Core CORS? Да, конечно.

Это просто и легко использовать CORS с .NET Core.

Вам просто нужно выполнить следующие шаги:

  • Установите пакет Microsoft.AspNetCore.Cors Nuget.
  • Настройте CORS в методе ConfigureService.
  • Включить CORS с использованием промежуточного программного обеспечения в методе Configure.
  • Включите CORS в .NET Core MVC, включив его в контроллерах или действиях или глобально. ссылка

обновление

Нет JSON - Нет Workey Если вы хотите отправить строку RAW или двоичные данные, и вы хотите забрать их как часть вашего запроса, все становится сложнее. ASP.NET Core обрабатывает только то, что ему известно, по умолчанию это данные JSON и Form. По умолчанию необработанные данные напрямую не сопоставляются с параметрами контроллера.

По сути, я делаю то же самое, что и в первом запросе, за исключением того, что я отправляю не тип контента JSON, а простой текст. Конечная точка существует, но MVC не знает, что делать с текстовым / обычным содержимым или как отображать его, поэтому происходит сбой с 404 Not Found.

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

Итак, как нам получить необработанные данные?

Запрос на чтение. Тел для необработанных данных К сожалению, ASP.NET Core не позволяет вам просто захватывать «сырые» данные каким-либо осмысленным способом только с помощью параметров метода. Так или иначе, вам нужно выполнить некоторую пользовательскую обработку Request.Body, чтобы получить необработанные данные и затем десериализовать их.

Вы можете захватить необработанный Request.Body и прочитать необработанный буфер из того, что довольно просто.

Самый простой и наименее навязчивый, но не столь очевидный способ сделать это - иметь метод, который принимает данные POST или PUT без параметров, а затем считывает необработанные данные из Request.Body:

[HttpPost]
[Route("api/BodyTypes/ReadStringDataManual")]
public async Task<string> ReadStringDataManual()
{
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {  
        return await reader.ReadToEndAsync();
    }
}

Проверить это сообщение

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