2016-11-03 2 views
3

Я пишу контроллер API, предназначенный для приема и анализа содержимого асинхронной почты JSON и не могу прочитать содержимое объекта StringContent в этом сообщении.Как я могу прочитать JSON из объекта StringContent в ApiController?

Вот раздел моего контроллера API, где я ожидаю увидеть значение. Значение, поступающее в метод ApiController, равно null. Значение jsonContent представляет собой пустую строку. То, что я ожидаю увидеть, - это содержимое объекта JSON.

public class ValuesController : ApiController 
{ 
    // POST api/values 
    public void Post([FromBody]string value) 
    { 
     HttpContent requestContent = Request.Content; 
     string jsonContent = requestContent.ReadAsStringAsync().Result; 

     // Also tried this per mybirthname's suggestion. 
     // But content ends up equaling 0 after this runs. 
     var content = Request.Content.ReadAsStreamAsync().Result.Seek(0, System.IO.SeekOrigin.Begin); 
    } 
} 

вот мой контроллер, чтобы показать, как его называют.

[HttpPost] 
public ActionResult ClientJsonPoster(MyComplexObject myObject) 
{ 
    this.ResponseInfo = new ResponseInfoModel(); 
    PostToAPI(myObject, "http://localhost:60146", "api/values").Wait(); 
    return View(this.ResponseInfo); 
} 

И это способ публикации.

private async Task PostToAPI(object myObject, string endpointUri, string endpointDirectory) 
{ 
    string myObjectAsJSON = System.Web.Helpers.Json.Encode(myObject); 
    StringContent stringContent = new StringContent(myObjectAsJSON, Encoding.UTF8, "application/json"); 
    using (HttpClient httpClient = new HttpClient()) 
    { 
     httpClient.BaseAddress = new Uri(endpointUri); 
     using (HttpResponseMessage responseMessage = await httpClient.PostAsJsonAsync(endpointDirectory, stringContent).ConfigureAwait(false)) 
     { 
      // Do something 
     } 
    } 
} 

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

+1

Возможный дубликат [Невозможно прочитать Request.Content в контроллере ASP.NET WebAPI] (http://stackoverflow.com/questions/10127803/cannot-read-request-content-in -Asp-нетто-WebAPI-контроллер). Проверьте ответ с 7 upvotes, он объясняет, почему действительно хорошо! – mybirthname

+1

Покажите, как это называется. похоже, что вы смешиваете вызовы async и sync, которые обычно приводят к взаимоблокировкам. Ключ - это '.Wait()' в вашем exameple. – Nkosi

+0

Спасибо за предложения. Я попытался сбросить позицию потока контента, и это вернуло значение long со значением 0. Вы можете увидеть, как я применил это в методе Post(). Кроме того, если ошибка .Wait() неверна, как это нужно отрегулировать, чтобы избежать блокировки? Благодарю. –

ответ

2

Вы смешиваете асинхронные и синхронизирующие вызовы, которые приведут к взаимоблокировкам.

контроллер Обновление

[HttpPost] 
public async Task<ActionResult> ClientJsonPoster(MyComplexObject myObject) { 
    this.ResponseInfo = new ResponseInfoModel(); 
    await PostToAPI(myObject, "http://localhost:60146", "api/values"); 
    return View(this.ResponseInfo); 
} 

Также используется, чтобы заставить Web API, чтобы прочитать простой тип из тела запроса.

Update Api

public class ValuesController : ApiController { 
    // POST api/values 
    [HttpPost] 
    public async Task Post() { 
     var requestContent = Request.Content; 
     var jsonContent = await requestContent.ReadAsStringAsync(); 

    } 
} 
+0

Спасибо, я сделаю это. –

+0

Это работало как чемпион @Nkosi. Спасибо за вашу помощь. –

Смежные вопросы