WebAPI Put returns HTTPResponseMessage null

WebAPI Put returns HTTPResponseMessage null

我需要执行简单的编辑 functionality.I 我正在使用 webapi 服务来更新我的测试对象。 我正在从控制器 post 请求中调用以下方法。

这是控制器,它在测试调用中调用方法,然后调用放置服务

public ActionResult TestEdit(Test test)
{
  if (ModelState.IsValid)
  {
    // objTest is returned null
    HttpResponseMessage objtest = TestDatabaseService.TestEdit(test.testID, test);
  }
}

// Method which calls put service testDataService
public HttpResponseMessage TestEdit(int id, Test test)**
{
   string uri = baseUri + "Test/" + id;
   using (HttpClient httpClient = new HttpClient())
   {
      Task<HttpResponseMessage> response = httpClient.PutAsJsonAsync<Test>(uri, application);
            return response.Result;
   }
}

// The webapi service put method 
public HttpResponseMessage PutTest(int id, Test test)
{
  if (ModelState.IsValid && id == test).testID)
  {
    db.Entry(test)).State = EntityState.Modified;

    try
    {
      db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
      return Request.CreateResponse(HttpStatusCode.NotFound); 
    }

    // The status code is set to indicate the save is success
    return Request.CreateResponse(HttpStatusCode.OK); 
  }
  else
  {
    // If save failed
    return Request.CreateResponse(HttpStatusCode.BadRequest); 
  }
}

。 public Application TestCreate(测试​​测试) { 字符串 uri = baseUri + "Test"; 使用 (HttpClient httpClient = new HttpClient()) { 任务响应 = httpClient.PostAsJsonAsync(uri, test); return JsonConvert.DeserializeObjectAsync(response.Result.Content.ReadAsStringAsy‌ nc().Result).Result; } }

这毫无意义:

JsonConvert.DeserializeObjectAsync<HttpResponseMessage>(response.Result.Content.ReadAsStringAsync().Result).Result

响应已经一个HttpResponseMessage:

Task<HttpResponseMessage> response

没有要反序列化的内容。您所要做的就是 await 它以获得结果。首先,让你的方法 async:

public async Task<HttpResponseMessage> TestEdit(int id, Test test)

然后在方法中等待结果:

return await httpClient.PutAsJsonAsync<Test>(uri, test);

这将有效地 return HttpResponseMessage 对象。所以也制作这个async

public async Task<ActionResult> TestEdit(Test test)

等待您的其他方法:

HttpResponseMessage objtest = await TestDatabaseService.TestEdit(test.testID, test);

目前还不是很清楚为什么您需要在多个方法后面抽象它,但如果语义对您的需求有意义,那很好。不会立即造成伤害。

但基本上,您是在尝试告诉 JSON 反序列化程序反序列化某些东西,嗯,不是 JSON 表示该对象的东西。所以结果将是 null,因为反序列化会悄悄地失败。但关键是你不需要在这里反序列化任何东西。 PutAsJsonAsync<T> 已经 return 类型为 HttpResponseMessage 的对象。