无法从web api返回类型Microsoft.Azure.Documents.Document

时间:2015-05-11 07:11:18

标签: asp.net-web-api asp.net-web-api2 azure-cosmosdb

我使用的是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的新手。我认为返回值应该是任务的类型,即任务。那说我试过回来都无济于事。

1 个答案:

答案 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