我使用的是Azure Document DB,可以使用下面的代码成功创建对象。但是,我无法将创建的对象返回给客户端。尽管代码命中行返回Ok(doc); Fiddler和Postman的反应总是空洞的。
控制器
[HttpPost]
[Route("")]
public IHttpActionResult CreateNewApplication(dynamic data)
{
if (data == null)
{
return BadRequest("data was empty");
}
try
{
var doc = _applicationResource.Save(data);
return Ok(doc);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
资源
public async Task<Document> Save(dynamic application)
{
Document created;
using (Client)
{
application.id = Guid.NewGuid();
var database = await RetrieveOrCreateDatabaseAsync(Database);
var collection = await RetrieveOrCreateCollectionAsync(database.SelfLink, CollectionName);
//persist the documents in DocumentDB
created = await Client.CreateDocumentAsync(collection.SelfLink, application);
}
Debug.WriteLine("Application saved with ID {0} resourceId {1}", created.Id, created.ResourceId);
return created;
}
注意我是使用async / await的新手。我认为返回值应该是任务的类型,即任务。那说我试过回来都无济于事。
答案 0 :(得分:1)
首先,如果await
为返回Task<T>
的函数,则会得到类型为T
的值。这就是你将await
字放在函数调用前面的原因。
其次,使Web API易于使用的原因是您不需要在HTTP协议级别上工作并返回手工创建的IHttpActionResult
:您应该直接返回所需的值,而不是将其“包装”在任何HTTP工件中。
如果您的操作方法可以返回不同类型的值,请将返回类型声明为object
。但通常你总会在你的情况下返回一个相同类型的对象Document
,如果有错误,你可以抛出HttpResponseException
而不是返回其他类型的值。详情请见Best practice to return errors in ASP.NET Web API