ASP.NET 找不到核心 ODataController
ASP.NET Core ODataController not found
我正在尝试在现有 ASP.NET (.net5) api.
中构建一个非常简单的 odata 服务
使用:
<PackageReference Include="Microsoft.AspNetCore.OData" Version="8.0.0-rc3" />
我以为会很简单(我只需要支持GET和Get-$count),但我肯定漏掉了什么。
这是我的:
型号:
public partial class MySuspension
{
public long Id { get; set; }
[Required]
[StringLength(50)]
public string AccountName { get; set; }
[Column(TypeName = "datetime")]
public DateTime RegisteredDate { get; set; }
[StringLength(8)]
public string Responder { get; set; }
public long? UnblockPermissions { get; set; }
}
我将 entity framework 用于数据库访问,因此模型 class 是为 EF 生成的(因此有一些属性)。
启动:
这是“配置”方法的基本顺序:
app.UseMiddleware<GlobalExceptionHandlerMiddleware>();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseODataRouteDebug(); ///// <----
app.UseODataQueryRequest();///// <----
app.UseODataBatching();///// <----
app.UseCors("InternalApplications");
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);
UseSwagger(app);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHealthChecks("/health");
});
我这样注册我的控制器:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("ActSus");
var model0 = builder.GetEdmModel();
services.AddControllers()
.AddOData(opt =>
{
opt.AddModel("data",model0)
.Count().Filter().Expand()
.Select().OrderBy()
.SetMaxTop(null);
});
以上设置非常适合“正常”api 方法,因此没有任何 auth/cors 问题。
控制器:
public class AccountActionController : ODataController
{
private readonly MyDbContext _dbContext;
public AccountActionController(MyDbContext dbContext)
{
_dbContext = dbContext;
}
[EnableQuery]
[HttpGet]
public IActionResult Get()
{
return Ok(_dbContext.AccountSuspensions);
}
}
据我了解,这应该可行。我继承自 OdataController - 这(我认为)意味着我不需要使用任何其他属性。我认为甚至 HttpGet 和 EnableQuery 属性也可能是多余的。
当我 运行 它时,odata 路由调试页面显示 ~/data 和 ~/data/$metadata 作为唯一的 OData 端点。
~/data/$metadata 显示了正确的 XML 文档,准确定义了我的 MySuspension 对象。
AccountActionController 未出现在 Odata 端点或非 Odata 端点中!!!
啊啊!!!沮丧!!!
我知道我是个白痴,但我一辈子都看不出自己做错了什么。
任何帮助将不胜感激。
谢谢。
The AccountActionController does not appear in either the Odata
endpoint or in the non-odata endpoints!!!
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("ActSus");
var model0 = builder.GetEdmModel();
问题与上述代码有关,由于Controller的名字是AccountAction
,你应该把实体集的名字从ActSus
改成AccountAction
,代码如下:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("AccountAction"); //change the name.
var model0 = builder.GetEdmModel();
services.AddControllers().AddOData(opt =>
opt.AddModel("odata", model0)
.Count().Filter().Expand()
.Select().OrderBy()
.SetMaxTop(null)
);
那么结果是这样的:
如果要更改请求 url,请尝试使用 Attribute Routing in ASP.NET Core OData 8.0 RC。
我正在尝试在现有 ASP.NET (.net5) api.
中构建一个非常简单的 odata 服务使用:
<PackageReference Include="Microsoft.AspNetCore.OData" Version="8.0.0-rc3" />
我以为会很简单(我只需要支持GET和Get-$count),但我肯定漏掉了什么。
这是我的:
型号:
public partial class MySuspension
{
public long Id { get; set; }
[Required]
[StringLength(50)]
public string AccountName { get; set; }
[Column(TypeName = "datetime")]
public DateTime RegisteredDate { get; set; }
[StringLength(8)]
public string Responder { get; set; }
public long? UnblockPermissions { get; set; }
}
我将 entity framework 用于数据库访问,因此模型 class 是为 EF 生成的(因此有一些属性)。
启动:
这是“配置”方法的基本顺序:
app.UseMiddleware<GlobalExceptionHandlerMiddleware>();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseODataRouteDebug(); ///// <----
app.UseODataQueryRequest();///// <----
app.UseODataBatching();///// <----
app.UseCors("InternalApplications");
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);
UseSwagger(app);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHealthChecks("/health");
});
我这样注册我的控制器:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("ActSus");
var model0 = builder.GetEdmModel();
services.AddControllers()
.AddOData(opt =>
{
opt.AddModel("data",model0)
.Count().Filter().Expand()
.Select().OrderBy()
.SetMaxTop(null);
});
以上设置非常适合“正常”api 方法,因此没有任何 auth/cors 问题。
控制器:
public class AccountActionController : ODataController
{
private readonly MyDbContext _dbContext;
public AccountActionController(MyDbContext dbContext)
{
_dbContext = dbContext;
}
[EnableQuery]
[HttpGet]
public IActionResult Get()
{
return Ok(_dbContext.AccountSuspensions);
}
}
据我了解,这应该可行。我继承自 OdataController - 这(我认为)意味着我不需要使用任何其他属性。我认为甚至 HttpGet 和 EnableQuery 属性也可能是多余的。
当我 运行 它时,odata 路由调试页面显示 ~/data 和 ~/data/$metadata 作为唯一的 OData 端点。
~/data/$metadata 显示了正确的 XML 文档,准确定义了我的 MySuspension 对象。
AccountActionController 未出现在 Odata 端点或非 Odata 端点中!!!
啊啊!!!沮丧!!!
我知道我是个白痴,但我一辈子都看不出自己做错了什么。
任何帮助将不胜感激。
谢谢。
The AccountActionController does not appear in either the Odata endpoint or in the non-odata endpoints!!!
var builder = new ODataConventionModelBuilder(); builder.EntitySet<MySuspension>("ActSus"); var model0 = builder.GetEdmModel();
问题与上述代码有关,由于Controller的名字是AccountAction
,你应该把实体集的名字从ActSus
改成AccountAction
,代码如下:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("AccountAction"); //change the name.
var model0 = builder.GetEdmModel();
services.AddControllers().AddOData(opt =>
opt.AddModel("odata", model0)
.Count().Filter().Expand()
.Select().OrderBy()
.SetMaxTop(null)
);
那么结果是这样的:
如果要更改请求 url,请尝试使用 Attribute Routing in ASP.NET Core OData 8.0 RC。