Заголовок HTTP отправляется, но отсутствует в Request.Headers - PullRequest
2 голосов
/ 24 марта 2019

Мой код стороны API выглядит следующим образом:

[HttpPost]
[Route("api/Login")]
public HttpResponseMessage ValidateLogin(UserModel user)
{
    IEnumerable<string> customJsonInputString;

    if (!Request.Headers.TryGetValues("Content-Type", out customJsonInputString))
        return new HttpResponseMessage(HttpStatusCode.BadRequest);

    var customJsonInputArray = customJsonInputString.ToArray();

    var ProductsRequest =
      Newtonsoft.Json.JsonConvert.DeserializeObject<UserModel>(customJsonInputArray[0]);

    var result = _service.Fetch(
            new UserModel
            {
                Username = user.Username,
                Password = user.Password.GenerateHash()
            }
        );
    return Request.CreateResponse(HttpStatusCode.OK, result);
}

Я пытаюсь вызвать его из отдельного проекта, который находится в том же решении:

[HttpPost]
public async Task<ActionResult> Login(UserLoginModel user)
{
    UserModel data = new UserModel
    {
        Username = user.Username,
        Password = user.Password
    };

    using (var client = new HttpClient())
    {
        var myContent = JsonConvert.SerializeObject(data);
        var buffer = Encoding.UTF8.GetBytes(myContent);
        var byteContent = new ByteArrayContent(buffer);
        byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var endpoint = "http://localhost:55042/api/Login";

        var response = await client.PostAsync(endpoint, byteContent);

        throw new NotImplementedException();
    }
}

Проблема IЯ думаю, что это имя первого параметра Request.Headers.TryGetValues("Content-Type", out customJsonInputString), я искал в Интернете, но не нашел правильного описания / объяснения, каким должно быть это имя параметра (ну, я понял, что это имя заголовка, но я попыталсячтобы найти его также с помощью «ContentType» и результат тот же: «400 неверных запросов»), поэтому мои вопросы:

  • Что я делаю не так?
  • Это неправильночто я предположил, что имя заголовка будет «ContentType» или «Content-Type»?

Ответы [ 3 ]

0 голосов
/ 24 марта 2019

Заголовок Content-Type находится в Request.Content.Headers. Вы можете использовать свой текущий код для получения значений заголовков или проверить, если Request.Content.Headers.ContentType свойство равно null

//note added Content
if (!Request.Content.Headers.TryGetValues("Content-Type", out customJsonInputString))
    return new HttpResponseMessage(HttpStatusCode.BadRequest);

или

if (Request.Content.Headers.ContentType == null)
    return new HttpResponseMessage(HttpStatusCode.BadRequest);

ContentType свойство равно null, даже если заголовок Content-Type установлен, но недействителен.

0 голосов
/ 28 марта 2019

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

0 голосов
/ 24 марта 2019

Попробуйте обновить код следующим образом:

using (var client = new HttpClient())
        {
            var myContent = JsonConvert.SerializeObject(data);                
            var endpoint = "http://localhost:55042/api/Login";    
            var response = await client.PostAsync(endpoint, new StringContent(myContent, Encoding.UTF8,"application/json"));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...