ASP.NET Веб-API не получает данные, отправленные из Angular

#c# #asp.net #asp.net-mvc #angular #asp.net-web-api

#c# #asp.net #asp.net-mvc #angular #asp.net-web-api

Вопрос:

В настоящее время я пытаюсь опубликовать угловую модель в веб-API внутри .NET Core MVC. Модель на стороне Angular заполняется правильно до точки, в которой выполняется отправка в web API. Однако, когда они достигают API, модель выглядит следующим образом {"urlEndpoint":null,"token":null} .

Я попытался изменить заголовок Content-Type , я попытался добавить [FromBody] , я также попытался изменить контроллер с HttpResponseMessage на IHttpActionResult — практически каждое решение в stack overflow на самом деле похоже на проблемы. Однако интересно то, что этот же код работает в более старом проекте на standard .NET.

Любая помощь в этом была бы высоко оценена… это сводит меня с ума!

Угловой компонент:

  getPdfData() {

    let token = this.httpService.getToken("token");

    this.urlAndTokenModel = new UrlAndTokenModel();

    this.urlAndTokenModel.Token = token;
    this.urlAndTokenModel.UrlEndpoint = this.apiEndpoint;
    this.httpService.postPdfBytes('/blahblah/api/pleaseworkthistime', this.urlAndTokenModel, this.successCallback.bind(this),
        this.failureCallback.bind(this));

}
  

Угловой http.service

     postPdfBytes(url: string, data: UrlAndTokenModel, successCallback, errorCallback) {

    return this.http.post(url, data,
        {
            headers: new HttpHeaders().set('Content-Type', 'application/json'),
            responseType: 'blob'
        }

    ).subscribe(

        resp => successCallback(resp),
        error => errorCallback(error)
        );
}
  

Веб-API:

     public class TestController : BaseController
{
    public TestController(ICacheHelper cacheHelper) : 
        base(cacheHelper)
    {
    }

    [Route("api/pleaseworkthistime")]
    [HttpPost]
    public HttpResponseMessage GetDocument(UrlAndTokenModel data)
    {

        var client = new HttpClient();

        client.DefaultRequestHeaders.Add("Authorization", data.Token);

        var responseTask = client.GetAsync(data.UrlEndpoint);

        responseTask.Wait();

        var result = responseTask.Resu<

        byte[] finalResult = null;

        if (result.IsSuccessStatusCode)
        {

            var readTask = result.Content.ReadAsByteArrayAsync();
            readTask.Wait();

            finalResult = readTask.Resu<

        }

        var httpRequestMessage = new HttpRequestMessage();
        var httpResponseMessage = httpRequestMessage.CreateResponse(HttpStatusCode.OK);

        httpResponseMessage.Content = new ByteArrayContent(finalResult);
        httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = "mytestpdf.pdf";
        httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");

        return httpResponseMessage;
    }

}
  

Тогда, очевидно, есть angular URLAndTokenModel с URLEndpoint и токеном — то же самое отражено в модели C #.

Комментарии:

1. Уверены ли вы, что модель в вашем клиенте может быть десериализована в вашу модель C #? Если нет, пожалуйста, добавьте их в свой вопрос.

2. 100% 🙂 и, как я уже сказал, у меня был тот же код, работающий в другом проекте, поэтому это так сбивает с толку.

3. и вы настроили MVC для использования имен свойств camelCase?

4. У меня действительно есть 🙂

5. Все выглядит (и звучит) примерно так же. Не могли бы вы извлечь соответствующие фрагменты и опубликовать на github?

Ответ №1:

Наконец-то решил это! Я надеюсь, что это поможет кому-либо еще, столкнувшемуся с той же проблемой.

Когда он отправляет в .NET API, сначала это должен быть JSON.Stringify

  this.httpService.postPdfBytes('/blahblah/api/pleaseworkthistime', JSON.stringify(this.urlAndTokenModel), this.successCallback.bind(this),
        this.failureCallback.bind(this));
  

Поэтому angular http.service также необходимо обновить до string вместо model.

 postPdfBytes(url: string, data: string, successCallback, errorCallback)
  

на данный момент у него все еще не было этого, а затем простое добавление [FromBody] в контроллер и все!

 public HttpResponseMessage GetDocument([FromBody] UrlAndTokenModel data)