如何接受查询并返回异步任务?

时间:2017-05-16 21:34:14

标签: c# .net asp.net-web-api2 odata dynamics-crm-2016

我收到以下异常:

Cannot create an EDM model as the action 'Get' on controller 'Accounts' has a return type 'System.Web.Http.IHttpActionResult' that does not implement IEnumerable<T>.

尝试查询我的终端时:

http://localhost:8267/api/accounts

正在开展工作的AccountsController:

    public async Task<IHttpActionResult> Get(ODataQueryOptions options)
    {
        var query = options.Request.RequestUri.PathAndQuery;
        var client = new HttpClient();
        var crmEndPoint = @"HTTPS://MYCRMORG.COM/API/DATA/V8.1/";
        HttpResponseMessage response = await client.GetAsync(crmEndPoint+query);
        object result;
        if (response.IsSuccessStatusCode)
        {
            result = await response.Content.ReadAsAsync<object>();

            return Ok(result);
        }

        return NotFound();
    }

我做错了什么?我如何简单地将PathAndQuery添加到我的crmEndPoint并返回结果?

1 个答案:

答案 0 :(得分:1)

OData框架在普通Web API之上提供额外的响应格式化/查询规则。

使用ODataQueryOptions参数需要,操作方法会返回IQueryable<T>IEnumerable<T>

ODataQueryOptions只是有助于解析传入的OData请求网址,从而可以通过属性访问$filter$sort等参数。

您的代码不需要此服务,因为它所做的只是将请求重定向到crmEndPoint。因此,您可以通过控制器的options.Request属性访问请求对象,而不是使用Request,而是完全删除参数。

以下是代码:

public async Task<IHttpActionResult> Get()
{
    var query = Request.RequestUri.PathAndQuery;
    var client = new HttpClient();
    var crmEndPoint = @"HTTPS://MYCRMORG.COM/API/DATA/V8.1/";
    HttpResponseMessage response = await client.GetAsync(crmEndPoint + query);
    object result;
    if (response.IsSuccessStatusCode)
    {
        result = await response.Content.ReadAsAsync<object>();

        return Ok(result);
    }

    return NotFound();
}