【发布时间】:2016-06-17 07:58:43
【问题描述】:
我是新手,所以我将从代码开始,然后我会解释。 问题是这样的
[HttpGet, ODataRoute("({key})")]
public SingleResult<Employee> GetByKey([FromODataUri] string key)
{
var result = EmployeesHolder.Employees.Where(id => id.Name == key).AsQueryable();
return SingleResult<Employee>.Create<Employee>(result);
}
[HttpGet, ODataRoute("({key})")]
public SingleResult<Employee> Get([FromODataUri] int key)
{
var result = EmployeesHolder.Employees.Where(id => id.Id == key).AsQueryable();
return SingleResult<Employee>.Create<Employee>(result);
}
我有这 2 个操作,但对于一个我想按字符串搜索,另一个按数字搜索(尽管这不是问题)。如果我以这种方式离开它,它将适用于 (int) 情况,但对于字符串“....odata/Employees('someName')”,我将得到一个:HTTP 404(这是正常的)但如果我尝试使用字符串的方法更具体
webApiConfig 中的代码。
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Employee>("Employees");
builder.Function("GetByKeyFromConfig").Returns<SingleResult<Employee>>().Parameter<string>("Key");
控制器中的代码
[ODataRoutePrefix("Employees")]
public class FooController : ODataController
{
[HttpGet, ODataRoute("GetByKeyFromConfig(Key={key})")]
public SingleResult<Employee> GetByKey([FromODataUri] string key)
{ ... }
}
我得到一个expcetion
{"复杂类型 'System.Web.Http.SingleResult`1[[OData_Path.Employee, OData_Path, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' 指的是 实体类型 'OData_Path.Employee' 通过属性 'Queryable'。"}
如果我在 WebApiConfig 中更改方法的返回类型
builder.Function("GetByKeyFromConfig").Returns<Employee>().Parameter<string>("Key");
我得到了这个,我不知道为什么。
{"路径模板'Employees/GetByKeyFromConfig(Key={key})' 控制器“Foo”中的操作“GetByKey”不是有效的 OData 路径 模板。请求 URI 无效。由于部分“员工” 引用一个集合,这必须是请求中的最后一个段 URI 或者后面必须跟一个可以绑定的函数或动作 否则所有中间段必须引用一个 资源。”}
我已经搜索并试图得到解释,但每次我找到答案都不起作用。我挣扎了好几天。
从2个答案中获取更新后
仍有无效的 OData 路径模板异常
WebApiConfig 代码
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Employee>("Employees").EntityType.HasKey(p => p.Name);
var employeeType = builder.EntityType<Employee>();
employeeType.Collection.Function("GetByKey").Returns<Employee>().Parameter<int>("Key");
config.EnableUnqualifiedNameCall(unqualifiedNameCall: true);
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: null,
model: builder.GetEdmModel());
控制器代码
[EnableQuery, HttpGet, ODataRoute("Employees/GetByKey(Key={Key})")]
public SingleResult<Employee> GetByKey([FromODataUri] int Key)
{
var single = Employees.Where(n => n.Id == Key).AsQueryable();
return SingleResult<Employee>.Create<Employee>(single);
}
我也尝试过使用特定的命名空间
builder.Namespace = "NamespaceX";
[EnableQuery, HttpGet, ODataRoute("Employees/NamespaceX.GetByKey(Key={Key})")]
和
[EnableQuery, HttpGet, ODataRoute("Employees/NamespaceX.GetByKey")]
【问题讨论】:
-
如果下面的任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
标签: c# asp.net asp.net-web-api odata asp.net-web-api2