Почтовый контроллер распознает только параметры, отправленные почтой «from-data» или «x-www-form-urlencoded» - PullRequest
0 голосов
/ 26 марта 2019

У меня очень простой контроллер

        [AllowAnonymous]
        [HttpPost]
        [Route("login")]
        public IActionResult Login([FromForm]PhotoLoginDto photologin)
        {
           //doing some stuff here
        }

И еще более простой отправитель на стороне клиента:

  const requestOptions = {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(photologin)
  };
  console.log("request");
  console.log(requestOptions);
  return fetch(config.apiUrl + "/PhotoLogin/login", requestOptions).then(
    handleResponse,
    handleError
  );

Однако после вызова контроллера отправки запроса IActionResult работает нормально, но переменная photologin всегда имеет пустые поля / поля по умолчанию."console.log (requestOptions);"дисплеи:

{method: "POST", headers: {…}, body: "{"Pin":"3","LoginTime":1553604239315,"Photo":"data…ur1DU622EzHVJTtskqJGPzoooqisUBz/s0VJzWpP6E//9k="}"}
body: "{"Pin":"3","LoginTime":1553604239315,"Photo":"adsf"}"
headers: {Content-Type: "application/json"}
method: "POST"

Если я пытаюсь использовать тот же JSON через почтальона (тело / сырье), я получаю тот же результат.Однако он отлично работает как «form-data» или «x-www-form-urlencoded».Я также попытался поместить эти три значения отдельно (не как один объект) с обеих сторон, клиента и сервера в разных конфигурациях.Я заменил «FromForm» на «FromBody» или удалил этот атрибут complitley, но все равно ничего.
Dto реквизиты идентичны отправленным данным.Я разрешаю все источники для CORS.
Если у кого-то из вас возникла подобная проблема, я был бы признателен за небольшую помощь.

EDIT. Also captured response<br/>
body: ReadableStream
locked: true
__proto__: ReadableStream
bodyUsed: true
headers: Headers
__proto__: Headers
ok: false
redirected: false
status: 400
statusText: "Bad Request"
type: "cors"

Это может быть серьезной проблемой с cors, но, как я уже сказал, все настроено так: «разрешить любое происхождение, разрешить любой метод, разрешить любой заголовок, разрешить учетные данные»

1 Ответ

1 голос
/ 26 марта 2019

Вы связываете как [FromForm], что буквально означает, что оно будет связывать только закодированные запросы x-www-form-urlencoded и multipart/form-data. Если вы хотите что-то вроде JSON или XML, тогда вам нужно использовать [FromBody].

Если ваш вопрос на самом деле заключается в том, что вы хотите принять все x-www-form-urlencoded, multipart/form-data и JSON / XML, то ответ - вы не можете - не из того же действия. Если вам нужно сделать это, вам понадобятся два отдельных действия (и маршруты). Общий код затем может быть преобразован в приватный метод. Например:

private IActionResult LoginCore(PhotoLoginDto photologin)
{
    //doing some stuff here
}

[AllowAnonymous]
[HttpPost]
[Route("login")]
public IActionResult LoginForm([FromForm]PhotoLoginDto photologin) =>
    LoginCore(photologin);

[AllowAnonymous]
[HttpPost]
[Route("login2")]
public IActionResult Login([FromBody]PhotoLoginDto photologin) =>
    LoginCore(photologin);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...