gpt4 book ai didi

asp.net - 抽象通用 ODataController 类导致 'No HTTP resource was found'

转载 作者:行者123 更新时间:2023-12-03 14:25:56 24 4
gpt4 key购买 nike

我正在尝试抽象 VS 2013 中自动生成的 ODataController 类,因为除了 POCO 的名称之外,不同 Controller 的代码看起来相同,因此,我做了以下操作:

 public abstract class ODataControllerBase<T,DB> : ODataController
where T : class, IIdentifiable, new()
where DB : DbContext, new()
{
protected DB _DataContext;

public ODataControllerBase() : base()
{
_DataContext = new DB();
}

// only one function shown for brevity
[Queryable]
public SingleResult<T> GetEntity([FromODataUri] int key)
{
return SingleResult.Create(_DataContext.Set<T>().Where(Entity => Entity.Id.Equals(key)));
}
}
IIdentifiable是一个接口(interface),它强制 T 参数具有可读/可写的 Id 整数属性。

实现看起来像这样(应该已经创建了 POCO 和 DataContexts)
public class MyObjectsController : ODataControllerBase<MyObject,MyDbContext>
{
public MyObjectsController() : base()
{
}

// That's it - done because all the repetitive code has been abstracted.
}

现在,我的 WebApiConfig 的 Register 函数只包含以下内容:
public static void Register(HttpConfiguration config)
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<MyObject>("MyObjects");
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
}

我运行这个项目, http://localhost:10000/odata/MyObjects我得到了回应:
<m:error>
<m:code/>
<m:message xml:lang="en-US">No HTTP resource was found that
matches the request URI `http://localhost:10000/odata/MyObjects.`
</m:message>
<m:innererror>
<m:message>No routing convention was found to select an action
for the OData path with template '~/entityset'.
</m:message>
<m:type/>
<m:stacktrace/>
</m:innererror>
</m:error>

什么不见​​了?我应该删除什么?这是我们不能做的事情吗,即我们真的需要继承 ODataController吗?直接没有中间父类?

最佳答案

在我们的一个项目中,我们还使用了一个通用的 ODataController 基类,我们实际使用了 GetEntity用于检索单个实体和 GetEntitySet用于检索实体列表。

根据您提供的 URL 和生成的错误消息,ODATA 框架找不到 ~/entityset 的 ODataAction。 .正如你所给出的 http://localhost:10000/odata/MyObjects例如,有问题的操作不能是 public SingleResult<T> GetEntity([FromODataUri] int key)因为这只对应于这样的查询 http://localhost:10000/odata/MyObjects(42) .

我们的通用 Controller 代码如下所示:

public abstract class OdataControllerBase<T> : ODataController
where T : class, IIdentifiable, new()
{
protected OdataControllerBase(/* ... */)
: base()
{
// ...
}

public virtual IHttpActionResult GetEntity([FromODataUri] long key, ODataQueryOptions<T> queryOptions)
{
// ...

return Ok(default(T));
}

public virtual async Task<IHttpActionResult> GetEntitySet(ODataQueryOptions<T> queryOptions)
{
// ...

return Ok<IEnumerable<T>>(default(List<T>));
}

public virtual IHttpActionResult Put([FromODataUri] long key, T modifiedEntity)
{
// ...

return Updated(default(T));
}

public virtual IHttpActionResult Post(T entityToBeCreated)
{
// ...

return Created(default(T));
}

[AcceptVerbs(HTTP_METHOD_PATCH, HTTP_METHOD_MERGE)]
public virtual IHttpActionResult Patch([FromODataUri] long key, Delta<T> delta)
{
// ...

return Updated(default(T));
}

public virtual IHttpActionResult Delete([FromODataUri] long key)
{
// ...

return Updated(default(T));
}
}

特定 Controller 的代码如下所示:
public partial class KeyNameValuesController : OdataControllerBase<T>
{
public KeyNameValuesController(/* ... */)
: base()
{
// there is nothing to be done here
}
}

但是我们发现两种 Get 方法(用于单个结果和可枚举结果)实际上都必须以 Get 开头。 .首先我们尝试了 List而不是 GetEntitySet这没有用,因为框架随后需要 POST对于 List行动)。

您实际上可以通过提供自定义 IHttpActionSelector 来验证和诊断解析过程。如 Routing and Action Selection in ASP.NET Web API 中所述(看看 ASP.NET WEB API 2: HTTP Message Lifecycle 可能也值得)。

所以实际上可以使用 GetEntity作为您最初在示例中尝试的方法名称,无需将其重命名为简单 Get .此外,无需对 ODATA 配置进行任何修改。

关于asp.net - 抽象通用 ODataController 类导致 'No HTTP resource was found',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com