ASP.NET Web Api 在应该返回 404 时返回 200 OK

2024-02-26

我在 ASP.NET Web API 项目中的控制器上有以下操作方法:

[Route("api/v2/project/{projectId}/stuff"), HttpGet]
public IHttpActionResult Get(int projectId)

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpGet]
public IHttpActionResult Get(int projectId, [FromUri] Guid id)

[Route("api/v2/project/{projectId}/stuff"), HttpPost]
public IHttpActionResult Post(int projectId, [Required] Stuff stuff)

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpPut]
public IHttpActionResult Put(int projectId, [FromUri] Guid blastId, Stuff stuff)

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpDelete]
public IHttpActionResult Delete(int projectId, [FromUri] Guid id)

由于 javascript 错误,我做了一个DELETE请求

api/v2/project/1234/stuff/undefined

即代替GUID对于 id,我得到了字符串"undefined"。据我所知,这不应该与我的任何路线匹配,而是404 Not found(甚至405 Method not allowed), 我有一个200 OK作为回应。

我在每个操作方法中设置了一个断点,并使用 Fiddler 重复了该请求,但没有一个断点被命中。我还尝试从 nuget 安装 WebApiRouteDebugger 包,但我们使用的是自定义控制器工厂,它通过我们的 DI 容器连接事物,所以我根本无法让它工作。我什至尝试从我的全局注册过滤器之一抛出以下异常:

throw new Exception(actionContext.ControllerContext.ControllerDescriptor.ControllerName +
" " + actionContext.ActionDescriptor.ActionName);

but the DELETE要求still经历到200 OK(似乎没有对有效网址的请求来做到这一点)。

我还能如何解决此问题?根本原因可能是什么?


在您的 Global.asax.cs 文件中,您的protected void Application_Start(object sender, EventArgs e)是,添加以下内容:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
    }

所有服务器请求都应该通过这里。

使用 if not there 添加这些。

using System.Web.Compilation;
using System.Reflection;

然后在开始请求调用中添加此代码以列出所有活动路由。

        string Items = "";
        IEnumerable<Assembly> Assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

        foreach (Assembly FoundAssembly in Assemblies)
        {
            string AssemblyName = FoundAssembly.FullName;
            IEnumerable<TypeInfo> Types = FoundAssembly.DefinedTypes.Where(type => type != null && type.IsPublic && type.IsClass && !type.IsAbstract && typeof(ApiController).IsAssignableFrom(type));
            foreach (TypeInfo ControllerType in Types)
            {
                System.Web.Http.Controllers.ApiControllerActionSelector ApiControllerSelection = new System.Web.Http.Controllers.ApiControllerActionSelector();
                System.Web.Http.Controllers.HttpControllerDescriptor ApiDescriptor = new System.Web.Http.Controllers.HttpControllerDescriptor(new System.Web.Http.HttpConfiguration(), ControllerType.Name, ControllerType);
                ILookup<string, System.Web.Http.Controllers.HttpActionDescriptor> ApiMappings = ApiControllerSelection.GetActionMapping(ApiDescriptor);

                foreach (var Maps in ApiMappings)
                {
                    foreach (System.Web.Http.Controllers.HttpActionDescriptor Actions in Maps)
                    {
                        Items += "[ controller=" + ControllerType.Name + " action=" + ((System.Web.Http.Controllers.ReflectedHttpActionDescriptor)(Actions)).MethodInfo + "]";
                    }
                }
            }
        }

这将列出所有控制器及其签名。如果您的 URL 不适合其中任何一个,您可能必须扩展列表以包含非控制器路由。

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

ASP.NET Web Api 在应该返回 404 时返回 200 OK 的相关文章

随机推荐

  • 事件网格吞吐量限制

    我是天蓝色事件网格概念的新手 目前正在研究事件网格以在我们的项目中实现 任何人都可以告诉我们事件网格的吞吐量吗 每秒我可以推送多少个事件以及每秒事件网格的出口是多少 意味着每秒从事件网格输出事件的数量 我向微软询问了这个话题 他们的回应是
  • Java中的抽象类和方法,继承

    我有类 B 它继承自类 A 超类 A 是抽象的 包含一个抽象方法 我不想在类 B 中实现抽象方法 因此我也需要将类 B 声明为抽象方法 声明 B 类抽象 有两件事对我有用 程序正确编译和运行 1 我没有在类 B 中声明任何抽象方法 即使该类
  • MongoDB 唯一索引不允许覆盖

    我在 Mongo 文档中的一个字段上创建了一个 unique true 索引 这按预期工作 它通过覆盖现有条目来禁止重复 我想禁止覆盖 而是在尝试插入重复项时出现错误或异常 有什么办法可以做到这一点吗 我该如何使用 Spring Data
  • 如何重用/重置 ZipInputStream?

    我想重置 ZipInputStream 即回到起始位置 以便按顺序读取某些文件 我怎么做 我好卡住 ZipEntry entry ZipInputStream input new ZipInputStream fileStream item
  • CSS 中是否可以使用表示行的元素来构建网格?

    我正在尝试使用 HTML CSS 为现代浏览器复制此设计 它本质上是一个包含行和列的表格 这意味着如果一行的名称单元格变大 那么所有行的名称单元格都应该变大 我看到两种可能性 表格和 CSS 网格 据我所知 表格中的行的样式不够 例如它们不
  • .Net框架中是否有系统错误代码的枚举?

    我有一个返回 GetLastError 代码的库函数 像这样的事情 http msdn microsoft com en us library ms681381 28v vs 85 29 aspx 我需要将它们与特定错误进行比较 例如ERR
  • 在unix中查找两个字符串的最长公共子串的shell命令是什么?

    在unix中查找两个字符串的最长公共子串的shell命令是什么 例如 foo abcdefghi abjklmdefnop 打印 def 我不确定是否有一个命令可以为您完成这项工作 但以下 bash 脚本应该可以完成这项工作 bin bas
  • 动态加载图像到div中

    我有一个个人资料图像列表 这些图像出现在 菜单下拉 div 中 该 div 最初通过 CSS 隐藏 我想在选择每个菜单项时动态加载这些图像 作为列表 以减少页面加载时间 这怎么可能 尝试使用 divID html img src path
  • GDB 如何处理大(>1 Gb)调试文件?

    我在使用远程 GDB 会话调试 C 应用程序时遇到问题 代码库很大 因此它包含 当使用 O2 g DNDEBUG 标志编译时 一个包含调试信息的大文件 1 1 Gb 不幸的是 我不能在调试期间只使用部分符号表 因为调试器始终会跳过应用程序的
  • for循环中的倒数

    我相信 根据一些研究阅读 for 循环中的倒计时实际上在运行时更高效 更快 我的完整软件代码是 C 我目前有这个 for i 0 i
  • 在 R 中使用 strsplit(),忽略括号中的任何内容

    我正在尝试使用strsplit 在 R 中根据逗号将字符串分成几部分 但我不想在括号中拆分任何内容 我认为答案是正则表达式 但我正在努力使代码正确 例如 x lt This is it isn t it well yes gt strspl
  • AngularJS 控制器和“严格使用”

    我最近开始使用 JSHint 它要求我使用 use strict 的函数形式 从那时起 AngularJS 就会抛出错误 错误 参数 webAddressController 不是函数 未定义 当我删除 use strict 的函数形式时
  • 从协议扩展调用选择器

    我正在构建简单的主题引擎 并且希望有一个扩展 可以添加UISwipeGestureRecognizer to UIViewController 这是我的代码 protocol Themeable func themeDidUpdate cu
  • 如何在flutter中读取XML文件?

    我正在尝试读取 flutter 中的 XML 文件 但每次我尝试读取该文件时 它只会引发错误 这是我读取 xml 文件的地方 我的 XML 文件很大 convertXMLtoJSON async File file File assets
  • 如何在 MVVM 中绑定到 PasswordBox

    我遇到了绑定到的问题PasswordBox 这似乎是一个安全风险 但我正在使用 MVVM 模式 所以我希望绕过这个 我在这里发现了一些有趣的代码 有人使用过这个或类似的东西吗 http www wpftutorial net Passwor
  • 为什么ItemTouchHelper.Callback的onChildDraw会在clearView之后被调用

    问题是我想在 RecyclerView 中拖动该项目时对其执行提升 根据文档所述 我应该在以下位置自定义拖动视图的行为ItemTouchHelper Callback onChildDraw https developer android
  • Typescript - 当传入多个键值时缩小函数中的 T[K]

    我正在尝试编写一个钩子 它接受对象的多个键并根据当前应用的过滤器过滤数据 所以 大致如下 interface IFilterable
  • 具有可变行高的 SWT 表:适用于 Linux,但不适用于 Mac/Windows

    问题 我需要一个具有可变行高的 SWT 表 JFace TableViewer 事实上 我在我的开发机器上解决了这个问题 运行 Ubuntu 10 10 不幸的是 这在 Windows 和 Mac 上都不起作用 最初 我以为我没有正确使用这
  • 在一行中多次递增 MATLAB 数组的一个值

    这是一个关于在同一语句中多次递增 MATLAB 数组的一个值而无需使用 for 循环的问题 我将数组设置为 gt gt A 10 20 30 然后运行 gt gt A 1 1 A 1 1 20 3 A 13 20 30 显然 20 被忽略了
  • ASP.NET Web Api 在应该返回 404 时返回 200 OK

    我在 ASP NET Web API 项目中的控制器上有以下操作方法 Route api v2 project projectId stuff HttpGet public IHttpActionResult Get int project