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
的对象。
我需要执行简单的编辑 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
的对象。