CreateRef方法迁移到.Net Core导致404,如何使用.Net Core在OData中实现创建关系

2024-03-05

我有 2 个 POCO、教训和具有 int PK 的特征。 我设置了导航属性,以便我可以成功$expand像这样:

  • http://localhost:54321/odata/Lessons?$expand=Traits
  • http://localhost:54321/odata/Traits?$expand=Lessons

我将项目从 Net 461 迁移到 .Net Core 2 的最后一个障碍是建立关系 https://learn.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4#creating-a-relationship-between-entities.

具体来说,当我尝试使用以下请求调用以下方法时,我得到 404。

[AcceptVerbs("POST", "PUT")]        
public async Task<IActionResult> CreateRef(
    [FromODataUri] int key, string navigationProperty, [FromBody] Uri link)
{
    ....  Do Work
}

邮递员请求:

http://localhost:54321/odata/Lessons(1)/Traits/$ref

body:

 {
    "@odata.id":"http://localhost:54321/OData/traits(1)"
 }

以下是我的Startup.Configure method.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    var builder = ConfigureOdataBuilder(app);

    app.UseMvc(routeBuilder =>
    {
        routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
        routeBuilder.MapODataServiceRoute("ODataRoute", "odata", builder.GetEdmModel());

        // Work-around for #1175
        routeBuilder.EnableDependencyInjection();
        routeBuilder.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // enable mvc controllers
    });            
}

private ODataConventionModelBuilder ConfigureOdataBuilder(IApplicationBuilder app)
{
    var builder = new ODataConventionModelBuilder(app.ApplicationServices);

    builder.EntitySet<Lessons>(nameof(Lessons));
    builder.EntitySet<Traits>(nameof(Traits));       

    return builder;
}

问题:我如何达到这个控制器方法?

我尝试过的事情,

  • 将 CreateRef 重命名为 CreateLink 并创建
  • 关注了这些 Git 问题中的每个链接,here https://github.com/OData/WebApi/issues/939 and here https://github.com/OData/WebApi/issues/975#issuecomment-353488806.
  • 继续阅读属性路由 http://odata.github.io/WebApi/#03-03-attrribute-routing spec.
  • 尝试了基于此 DeleteRef 的解决方案Web Api oData v4 $ref 404 或服务器错误 https://stackoverflow.com/questions/36678752/web-api-odata-v4-ref-404-or-server-error
  • 尝试明确定义路线[ODataRoute("Lessons({key})/{navigationProperty}")]

虽然走了很长的路,但我终于找到了答案。

[ODataRoute("lessons({lessonId})/traits({traitId})/$ref")]
public IActionResult CreateRef([FromODataUri] int lessonId, [FromODataUri] int traitId)
{
    //do work
}

重要提示:您必须像我一样调用 id-params。不要只称他们为 Id - 否则你会得到 404。

还有一件事...

对于那些尝试从 microsoft 文档获取方法的人 - Api-Names 已更改。您不需要它们来完成此任务,但如果您必须将 Uri 转换为 OData-Path,这里有一个 Uri-Extension 可以执行此操作为你:

public static Microsoft.AspNet.OData.Routing.ODataPath CreateODataPath(this Uri uri, HttpRequest request)
{
    var pathHandler = request.GetPathHandler();
    var serviceRoot = request.GetUrlHelper().CreateODataLink(
                            request.ODataFeature().RouteName, 
                            pathHandler, 
                            new List<ODataPathSegment>());

    return pathHandler.Parse(serviceRoot, uri.LocalPath, request.GetRequestContainer());
}

如果你有这样的 Uri:http://localhost:54321/OData/traits(1)您可以将其拆分为 OData 段以获得例如导航:returnedPath.NavigationSource或指定的键:returnedPath.Segments.OfType<KeySegment>().FirstOrDefault().Keys.FirstOrDefault().Value

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CreateRef方法迁移到.Net Core导致404,如何使用.Net Core在OData中实现创建关系 的相关文章

随机推荐

  • 没有span标签的微数据

    我有一个网站 设计者将 CSS 应用于基本 标签 这使得该标签对于微数据标记实际上毫无用处 除非我希望所有文本都是蓝色 粗体 并且比正常情况大 125 我可以使用其他标签吗 我知道我可以使用 但我实际上希望内容出现 而且必须写两次似乎有点过
  • 将对象属性限制为 keyof 接口

    此代码将无法编译 interface IFoo a number type TFoo keyof IFoo type OFoo key TFoo any let obj OFoo a 1 我想要实现的是 obj 只能与具有有效属性的对象一起
  • Bootstrap 弹出窗口被裁剪到包含 div 的范围

    我希望将弹出窗口包含在可折叠 div 中 http jsfiddle net nathan9 qgyS7 http jsfiddle net nathan9 qgyS7 然而 弹出窗口似乎仅限于 div 的范围 有没有办法防止剪辑 a hr
  • OpenCV - 校准鱼眼镜头误差(病态矩阵)

    我正在尝试按照这些说明校准鱼眼镜头https medium com kenneth Jiang calibrate fisheye lens using opencv 333b05afa0b0 https medium com kennet
  • 在 PyQt PushButton 单击期间发送附加变量[重复]

    这个问题在这里已经有答案了 我是 Python 和 PyQt 的新手 这是我的第一个应用程序 目前 当单击按钮时 toggleLED checks self LedOn来决定是否打开LED class Screen QWidget def
  • jquery - 获取html表的指定列中的元素

    使用 jquery 我想获取 html 表的指定列中的所有元素 请注意 它可以多于一列 例如 如果我有以下 html 表 table tr td a td td b td td c td tr tr td 1 td td 2 td td 3
  • 使用 rvest 抓取带有 span 的 html 表

    我正在使用 rvest 提取以下页面中的表 https en wikipedia org wiki List of United States presidential elections by popular vote margin ht
  • 动态 Servicefabric 设置和覆盖

    有没有办法完全不告诉服务有关设置 而只在应用程序级别提供它们 我仍然对 servicefabric 配置的工作方式不满意 据我所知 我必须在服务的 settings xml 中指定所有可能的配置值 然后我可以覆盖应用程序的 Applicat
  • elasticsearch:将“应该”变成过滤器

    我想使用过滤器进行搜索 排除与条件或另一个条件不匹配的结果 我尝试在过滤器中执行 应该 操作 但失败了 POST my index search query bool filter should match type1 title sear
  • 为什么抽象方法有时需要重写?

    基于一个上一个问题 https stackoverflow com questions 66182368 stack modification traits in scala not working 下面的代码编译OK trait Logg
  • 打开数据库图表后 SQL Server Management Studio 崩溃

    我在 SQL Server 2018 SSMS 18 1 的本地服务器中有 2 个现有数据库图 打开它时 应用程序变得 无响应 然后崩溃 没有任何错误 过去 7 天运行良好 意思是 18 如果您安装了 SSMS 版本 18 0 则数据库图已
  • Facebook 延迟深度链接在 iOS 上不起作用

    当我使用 Facebook 时一切正常应用广告助手 https developers facebook com tools app ads helper 深度链接测试器 应用程序将从 App Store 下载 URL 将被正确获取和处理 但
  • 如何找到 MySQL root 密码

    我无法弄清楚我的 MySQL root 密码 我怎样才能找到这个 是否有存储此密码的文件 我正在关注这个但我本地没有 directadmin 目录 感谢 thusharaK 我可以在不知道旧密码的情况下重置root密码 在 ubuntu 上
  • 如何在使用 PhoneGap/Cordova 构建的 Android 应用程序中单击按钮时播放音频?

    我正在构建一个类似音板的基本应用程序 其中有一些播放声音的按钮 我正在使用 PhoneGap Cordova 并使用 PhoneGap Build 服务将代码编译为 APK 起初 我使用简单的 HTML5
  • 如何在 %width div 内保持图像长宽比?

    很抱歉再次询问这个问题 但我的搜索没有显示任何我能够实现的内容 我在 div 中有一个具有以下样式的图像 div class thumb grid 6 img src img test2 jpg alt flavin div grid 6
  • 本月第几周

    我正在尝试获取该月的周数 这就是我想要做的 x date V echo x is x y date V d date Y m01 echo y is y week of month x y echo week of month is wee
  • 最有效的不区分大小写的 grep 用法是什么?

    我的目标是匹配属于 Yahoo 的电子邮件地址 域家族 在 nix 系统 我将使用 Ubuntu 中 这些匹配模式的方法中的任何一种都有哪些优点和缺点 如果还有我无法想象的另一种更优雅的解决方案 请分享 他们来了 Use grep有选项 i
  • 异步通知 BlockingQueue 有可用项目

    我需要一个Object当某些情况时得到异步通知BlockingQueue有一件物品要赠送 我在 Javadoc 和网络上搜索了一个预制的解决方案 然后我最终得到了我的一个 也许是幼稚的 解决方案 如下 interface QueueWait
  • 将 Dropwizard JDBI 升级到 JDBI 3

    如何将 dropwizard jdbi 2 78 升级到 jdbi 版本 3 因为我想利用其中包含的联接功能 项目成员在此 我们将在 v3 最终版本之前发布更完整的迁移指南 与此同时 我们的一位用户刚刚提交了一份不错的更改列表作为起点 Se
  • CreateRef方法迁移到.Net Core导致404,如何使用.Net Core在OData中实现创建关系

    我有 2 个 POCO 教训和具有 int PK 的特征 我设置了导航属性 以便我可以成功 expand像这样 http localhost 54321 odata Lessons expand Traits http localhost