Jquery WebAPI Put返回HTTPResponseMessage null
我需要实现简单的编辑功能。我正在使用webapi服务更新我的测试对象。 我正在从控制器post请求调用以下方法 这是在测试调用中调用metod的控制器,inturn调用put服务Jquery WebAPI Put返回HTTPResponseMessage null,jquery,asp.net-mvc-3,asp.net-mvc-4,asp.net-web-api,asp.net-mvc-5,Jquery,Asp.net Mvc 3,Asp.net Mvc 4,Asp.net Web Api,Asp.net Mvc 5,我需要实现简单的编辑功能。我正在使用webapi服务更新我的测试对象。 我正在从控制器post请求调用以下方法 这是在测试调用中调用metod的控制器,inturn调用put服务 public ActionResult TestEdit(Test test) { if (ModelState.IsValid) { // objTest is returned null HttpResponseMessage objtest = TestDatabaseService.Te
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 ActionResult TestEdit(测试)
{
if(ModelState.IsValid)
{
//objTest返回空值
httpresponsemessageobjtest=TestDatabaseService.TestEdit(test.testID,test);
}
}
//调用put服务testDataService的方法
公共httpresponsemessagetestedit(int-id,Test-Test)**
{
字符串uri=baseUri+“Test/”+id;
使用(HttpClient HttpClient=new HttpClient())
{
任务响应=httpClient.PutAsJsonAsync(uri,应用程序);
返回响应。结果;
}
}
//webapi服务put方法
公共HttpResponseMessagePuttest(int-id,Test-Test)
{
if(ModelState.IsValid&&id==test.testID)
{
db.Entry(test)).State=EntityState.Modified;
尝试
{
db.SaveChanges();
}
catch(DbUpdateConcurrencyException)
{
返回请求.CreateResponse(HttpStatusCode.NotFound);
}
//状态代码设置为指示保存成功
返回Request.CreateResponse(HttpStatusCode.OK);
}
其他的
{
//如果保存失败
返回请求.CreateResponse(HttpStatusCode.BadRequest);
}
}
。
公共应用程序TestCreate(测试)
{string uri=baseUri+“Test”;
使用(HttpClient HttpClient=new HttpClient())
{Task response=httpClient.PostAsJsonAsync(uri,test);
返回JsonConvert.DeserializeObjectAsync(response.Result.Content.ReadAsString)nc().Result)。结果;
}
}这毫无意义:
JsonConvert.DeserializeObjectAsync<HttpResponseMessage>(response.Result.Content.ReadAsStringAsync().Result).Result
没有什么可以反序列化的。你所要做的就是等待它的结果。首先,使您的方法异步
:
public async Task<HttpResponseMessage> TestEdit(int id, Test test)
等待您的其他方法:
HttpResponseMessage objtest = await TestDatabaseService.TestEdit(test.testID, test);
现在还不清楚为什么需要在多个方法后面抽象它,但是如果语义对您的需要有意义,那就好了。没有直接的伤害
但基本上,您试图告诉一个JSON反序列化程序反序列化某个对象,它不是该对象的JSON表示。因此结果将是
null
,因为反序列化将悄悄失败。但关键是,这里不需要反序列化任何内容PutAsJsonAsync
已经返回了类型为HttpResponseMessage
的对象。有人能解释一下这个问题的可能副本吗?你能理解我面临的问题吗?谢谢大卫,谢谢你给我指明了正确的道路。我用的是VS2010。net框架4.0。我无法添加async并等待。这不是识别。我认为这是4.5的一部分?@jubi:在这种情况下,您似乎必须使用较旧的方法来处理异步操作(我并不完全熟悉),或者使用这些操作的同步版本。您可以直接调用任务上的.Result
,也可以调用.Wait()
。无论您如何处理异步操作,要点都保持不变。从方法返回对象时不需要反序列化。您救了我。我做了如下修改:Task response=httpClient.PutAsJsonAsync(uri,应用程序);返回响应。结果;它成功了。非常感谢大家对创建我的代码是否为公共应用程序TestCreate(Test Test){string uri=baseUri+“Test”;使用(HttpClient-HttpClient=new-HttpClient()){Task response=HttpClient.postsjsonasync(uri,Test);返回JsonConvert.DeserializeObjectAsync(response.Result.Content.ReadAsStringAsync().Result).Result;}}}公共列表TestIndex(){字符串uri=baseUri+“Test/”,使用(HttpClient HttpClient=new HttpClient()){Task response=httpClient.GetStringAsync(uri);返回JsonConvert.DeserializeObjectAsync(response.Result).Result;}}这为我提供了添加的所有测试的列表视图。这是一种摘要。在“创建和列表”中,我进行了反序列化。我需要序列化它吗?是否正确?
return await httpClient.PutAsJsonAsync<Test>(uri, test);
public async Task<ActionResult> TestEdit(Test test)
HttpResponseMessage objtest = await TestDatabaseService.TestEdit(test.testID, test);