我收到以下异常:
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并返回结果?
答案 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();
}