ASP.Net Core WebApi 中的非属性路由

2023-12-14

我需要构建项目,实现由供应商应用程序预定义的 REST API(将使用它) - 有大约数千个 REST 资源,其中一些操作由不同的 HTTP 动词(POST、GET、PUT、DELETE 等)定义。 )。

因此,理想情况下,对于每个资源,我应该有一个像这样的类:

public class SomethingController
{
  public Something Post(string name, DateTime time)
  {
     // ...
  }

  public int PostStrange(string text)
  {
     // ...
  }

  public Something Put([FromBody]Something item)
  {
     // ...
  }

  public void Delete(int id)
  {
     // ...
  }
}

在以前的版本中,我可以在注册路由时调用 MapHttpRoute,继承这样的类ApiController- ASP.NET Web Api 将按照我的需要进行...但在 .NET Core 中我找不到像 MapHttpRoute/ApiController 这样的东西..现在有路由和 http-verb 属性,我需要显式定义所有内容每个类/方法:

[Route("api/[controller]")]
public class SomethingController : Controller
{
    [HttpPost]
    public Something Post(string name, DateTime time)
    {
        // ...
    }

    [HttpPost("api/[controller]/strange")]
    public int PostStrange(string text)
    {
        // ...
    }

    [HttpPut]
    public Something Put([FromBody]Something item)
    {
        // ...
    }

    [HttpDelete]
    public void Delete(int id)
    {
        // ...
    }
}

为数千个 REST 资源中的每一个编写此属性非常无聊且容易出错......

我在这里错过了什么吗?与旧的 ASP.NET 相比,为什么在相当新的现代 ASP.NET Core 中,构建 REST-Api 等非常常见且重要的事情变得如此复杂?


有nuget包Microsoft.AspNetCore.Mvc.WebApiCompatShim主要目标是让从 Web api 到 core 的迁移变得更容易。它还提供了一种方法来执行基于约定的路由到您需要的操作。因此,首先安装该软件包,然后在启动时:

public void ConfigureServices(IServiceCollection services) {
    // add conventions here
    services.AddMvc().AddWebApiConventions();                
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    app.UseMvc(routes => {
        // map one global route
        routes.MapWebApiRoute("WebApi", "api/{controller}");
    });
}

在这个小配置之后,您可以从继承您的控制器ApiController,添加到上面的包中是为了方便从web api或原生asp.net core迁移Controller。的例子ApiController:

public class SomeController : ApiController {
    // maps to GET /api/Some
    // note - no routing attributes anywhere
    public HttpResponseMessage Get() {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }

    // maps to POST /api/Some
    public HttpResponseMessage Post() {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

本机 asp.net core 控制器:

// mark with these attributes for it to work
[UseWebApiRoutes]
[UseWebApiActionConventions]
public class TestController : Controller {
    // maps to GET /api/Test
    // no routing attributes, but two "conventions" attributes
    public IActionResult Get(string p) {
        return new ObjectResult(new { Test = p });
    }
}

您还可以使用以下属性标记您的基本控制器:

[UseWebApiRoutes]
[UseWebApiActionConventions]    
public class BaseController : Controller {

}

public class TestController : BaseController {
    // maps to GET /api/Test
    // no attributes
    public IActionResult Get(string p) {
        return new ObjectResult(new { Test = p });
    }
}

如果您不从 Web api 迁移 - 我建议使用本机Controller. ApiController具有不同的结构(类似于 asp.net web api ApiController),因此没有太多理由将其用于除其预期目标(从 web api 迁移)之外的任何用途。

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

ASP.Net Core WebApi 中的非属性路由 的相关文章

  • 在 C# 中实例化 python 类

    我已经用 python 编写了一个类 我想通过 IronPython 将其包装到 net 程序集中 并在 C 应用程序中实例化 我已将该类迁移到 IronPython 创建了一个库程序集并引用了它 现在 我如何真正获得该类的实例 该类看起来
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • 堆栈独立的C/C++蓝牙API?

    我想知道是否有适用于 Windows XP Vista 7 x86 和 x64 的堆栈独立 C C 蓝牙 api 我的目标是创建连接并通过蓝牙发送 接收一些时间关键的数据 我的研究给了我以下选择以及这项任务的缺点 用于蓝牙的 Windows
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • EASTL 与 STL 相比,std::vector::operator[] 怎么会有这么大的性能差异

    根据http www open std org jtc1 sc22 wg21 docs papers 2007 n2271 html http www open std org jtc1 sc22 wg21 docs papers 2007
  • 如何在 asp .net mvc 2 中对不直接属于我的模型的对象使用 DisplayFor()?

    我确信我在这里遗漏了一些非常简单的东西 我创建了一个自定义日期时间显示模板 使用以下方法时效果很好 但是 我遇到了这样的情况 在部分控件内 我在 for 循环中迭代模型中的对象 我想要一个 DateTime 属性来使用显示模板 但我不知道如
  • 如何使用 ASP.NET MVC 4.0 DonutOutputCache VaryByCustom 使缓存失效

    我正在为我的 ASP NET 应用程序使用 DevTrends MvcDonutCaching 包 它工作得很好 我目前遇到的一个问题是使我为子操作设置的 VaryByCustom 缓存无效 这是我用于 VaryByCustom 设置的一些
  • 如何解决素数函数的大O表示法?

    我正在尝试理解 Big O 表示法 很抱歉 如果我问的问题太明显了 但我似乎无法理解这一点 我有以下 C 代码函数 我正在尝试为其计算 Big O 表示法 for i 2 i lt 100 i for j 2 j lt i j j if i
  • MSBuild 将动态生成的文件复制为项目依赖项的一部分

    我有一个自定义 msbuild 任务 它正在生成一些输出文件到 ProjectA 的输出目录 TargetDir 当前的代码是这样的
  • 如何检查是否发生溢出? [复制]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 正则表达式基于组的不同替换?

    所以我对正则表达式比较陌生 并且做了一些练习 我正在玩一个简单的 混淆器 它只是寻找 dot or dot or at or at 不区分大小写 并且在匹配项之前或之后有或没有任意数量的空格 这是针对通常情况的 someemail AT d
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind

随机推荐

  • 如何将 DOM 元素转换为 jQuery 元素?

    我正在使用 document createElement 创建一个元素 现在我如何将它传递给只接受 Jquery 对象的函数 id 我无法使用它 因为该元素尚未在页面中呈现 var elm document createElement di
  • 具有可为空值类型参数的扩展方法解析

    public static class Extension public static void Test this DateTime dt void Main var now DateTime Now Extension Test now
  • AD 计算机对象上的设置 ACL

    我正在尝试Set Acl在 AD 中的计算机对象上 首先我使用以下方法获取 ACL acl Get Acl AD CN Tester1 OU Ou1 OU OU2 OU OU3 DC Contoso DC com Access 这给了我该计
  • jQuery 可选择:如何在第一次加载时选择项目

    我正在使用 jQuery selectable 来选择 net 列表视图中的项目 用户可以选择他想要的项目 并可以通过单击保存按钮来保存它 下次当用户来到页面时 他将能够看到他之前选择的项目 使用 jQuery 可选择插件 用户可以通过单击
  • 是否有必要将 $scope 注入到 angularjs 中的控制器中? [复制]

    这个问题在这里已经有答案了 下面的两个代码片段有什么区别吗 两者都有效 1 myApp controller myAppController scope function scope function body 2 myApp contro
  • 在perl中的多行正则表达式中分割一行正则表达式

    我无法将正则表达式分成多行 我希望我的正则表达式与给定的行匹配 Code l k dfsakd lkaDald 所以我创建了这个有效的正则表达式 my firstRegexpr qr s s Code s code x 但现在我想像这样将它
  • AngularJS 1.2 跨源请求仅支持 HTTP

    有什么方法可以配置 Angular 应用程序以使其可用吗 在使用工厂时 顺便说一句 我使用本地主机作为网络服务器 但我正在向其他服务器 同一网络 发出请求 angular module demoApp factories factory d
  • C中的客户端服务器多个连接

    我试图推理用 C 语言实现的带有套接字的简单服务器如何处理并发客户端 假设一个简单的服务器等待客户端连接 然后读取客户端发送的消息 read 是一个阻塞函数 因此服务器将阻塞 直到客户端写入它 如果我们假设两个客户端同时向服务器写入数据 服
  • VB.NET 中的屏幕截图程序

    我创建了一个捕获桌面屏幕截图的应用程序 它与我在表单中使用的按钮配合得很好 但现在我想使用计时器让这个东西自动工作 但是每当我尝试运行程序时NullReferenceException发生任何人都可以告诉我这里出了什么问题吗 TimerCa
  • r - ggplot2 - 分割超过 2 组的小提琴图

    从哪里继续这个线程离开了 我想在 ggplot 2 中制作一个分割小提琴图 上面提出的方法仅限于 x 轴上的 2 个类别 Example set seed 20160229 my data data frame y c rnorm 1000
  • 如何将异步/标准库 future 转换为 futures 0.1?

    我想使用async函数逐步解析入站流 但 actix web 需要impl Future
  • 触发dialog.close 后,Word 加载项停止工作。办公JS

    我一直在开发一个 Office365 应用程序 在该应用程序中我打开了一个对话框 并在进行某种活动后使用dialog close 关闭对话框 它工作得很好 但功能区按钮停止工作 下次它不会再显示相同的对话框 Office context u
  • php中如何显示上传后的图片?

    将图像上传到文件夹后 怎么显示图片 这是我的 upload php
  • 打字稿回调函数中的“this”范围

    我无法理解 这个 上下文在打字稿中是如何工作的 我无法访问方法中的类成员 下面是我的代码 class adopterDetailCtrl public adopter IAdopter public router any static in
  • Django Admin 看起来很奇怪

    这是 Django 3 的新安装 我得到了面板的管理员外观 我在浏览器控制台中没有错误 我已经做了 python3 manage py collectstatic 一条线索 为了能够在没有 apache 500 错误的情况下看到这个管理面板
  • 如果没有 @Provides 注释的方法,则无法提供 >

    我正在尝试创建一个像这样的视图模型模块example但我遇到了这个错误 错误 如果没有 Provides 注释的方法 则无法提供 java util Map javax inject Provider gt 我遵循了所有示例 这是我的代码
  • 在 Visual Basic.NET 中构造对象而不对其进行赋值

    我已经使用 VB net 好几年了 但总是遇到一些我不知道如何解决的小问题 好奇心终于战胜了我 所以我现在问 有没有一种方法可以创建一个对象而不分配它 例如 假设我有一个 Engine 类 我想实例化它并让它立即执行它需要执行的任何操作 如
  • Windows 上的 symfony2 assetics yui 压缩器(路径语法)

    我正在尝试让 assetics 与 yui 压缩器一起运行 如果正在运行 则使用 sass 目前 两者都不起作用 当从 config yml 和 twig 模板中删除所有过滤器时 它可以工作并且php app console assetic
  • C# 第二维数组到一维数组的引用

    我有一个可以接受一维数组的函数 double 作为参数 而我的源数据是一个二维数组 double 的 cnt 3d 点数量 就像这样 double points new double 3 cnt 但我真正想做的是将三个第二个暗淡数组中的每一
  • ASP.Net Core WebApi 中的非属性路由

    我需要构建项目 实现由供应商应用程序预定义的 REST API 将使用它 有大约数千个 REST 资源 其中一些操作由不同的 HTTP 动词 POST GET PUT DELETE 等 定义 因此 理想情况下 对于每个资源 我应该有一个像这