当 url 以 & 符号结尾时.NET WebApi 中断

2023-11-30

我有一个 ApiController - 例如“Home”控制器,其操作“Test”接受两个参数 - test1 和 test2,两者都具有默认值

[System.Web.Http.HttpGet]
public ActionResult Test(int test1 = 3, int test2 = 5)
{
    var a = 0;
    return null;
}

现在当我打电话时家/测试?test1=1, 一切都好。
但当我打电话时主页/测试?test1=1&,服务器抛出异常

参数字典包含方法的不可空类型“System.Int32”的参数“test2”的空条目 'System.Web.Mvc.ActionResult 测试(Int32,Int32)' 'TestAPI.Controllers.ValuesController'。可选参数必须是 引用类型、可为 null 的类型或声明为可选类型 范围。

目前我的路由配置是这样的:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

这也发生在一个全新的 WebApi 项目上,所以它不是我的配置中的内容。
最大的问题是这个&符号来自客户项目,我无法在那里更改它,尽管我知道这是一个糟糕的请求。

最奇怪的是,如果 Home 控制器继承 Controller 而不是 ApiController - 一切都很好。

Edit 1
我忘了提及,如果我将参数设为可为空(即 int?),则错误就会消失,但在调用错误 URL 时 test2 的值为 null 而不是 5,因此这对我来说不是一个选择。


您可以使用自定义DelegatingHandler并删除尾随的“&”:

public class SanitizeHandler : System.Net.Http.DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.RequestUri.ToString().EndsWith("&"))
            request.RequestUri = new Uri(request.RequestUri.ToString().TrimEnd('&'));

        return base.SendAsync(request, cancellationToken);
    }
}

注册新的处理程序Application_Start:

GlobalConfiguration.Configuration.MessageHandlers.Add(new SanitizeHandler());

或者将其添加到您的HttpConfiguration(那么它只能通过 Webapi 调用来调用):

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

当 url 以 & 符号结尾时.NET WebApi 中断 的相关文章

  • 运行应用程序时.NET 3.5 JIT 不工作

    以下代码在 Visual Studio 内部运行该版本和在 Visual Studio 外部运行该版本时提供不同的输出 我正在使用 Visual Studio 2008 并面向 NET 3 5 我也尝试过 NET 3 5 SP1 在 Vis
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • Maven 为 JDK9 做好准备了吗?

    今天我尝试了最新jdk9 Build 113并尝试编译我的项目与最新的Maven 3 3 9 这些是命令 部分找到通过推特 export MVN OPTS Dmaven compiler fork Dmaven compiler execu
  • JavaScript 中的 Promise 是如何工作的?

    我刚刚实现了我的第一个函数 它根据 AngularJS 中的另一个承诺返回一个承诺 并且它有效 但在我决定之前just为了做到这一点 我花了 2 个小时阅读并试图理解 Promise 背后的概念 我想 如果我可以编写一段简单的代码来模拟 P
  • 登录 jirasoapapi

    我尝试在 C 上使用 jirasoap api 在VS2010中创建新项目 添加Web服务参考 JiraTest http jira atlassian com rpc soap jirasoapservice v2 wsdl 编写下一个代
  • 从 Honeycomb 操作栏中删除应用程序图标和标题

    如何删除操作栏中默认出现的应用程序图标和标题 这里有一个类似的问题 我可以在 Honeycomb 的操作栏中隐藏应用程序图标吗 但是没有讲怎么做 Call setDisplayShowHomeEnabled and setDisplaySh
  • 删除 Python 3 中字符串文字前面的“b”字符 do

    这个问题在这里已经有答案了 我是 python 编程新手 有点困惑 我尝试从字符串中获取字节进行哈希和加密 但我得到了 b b 字符位于字符串前面 如下例所示 有什么办法可以避免这种情况吗 谁能给出解决方案吗 抱歉问这个愚蠢的问题 impo
  • 解析带引号字段的字符串,如 Powershell 中的 CSV 行

    我必须将变量输入字符串解析为字符串数组 输入是 CSV 样式的逗号分隔字段列表 其中每个字段都有自己的带引号的字符串 因为我不想编写自己的成熟 CSV 解析器 所以到目前为止我可以创建的唯一可行的解 决方案就是这个 input Miller
  • 为什么内联 div 在 p 内有这样的行为

    在链接的示例中 我有一个文本和一个段落 其中每个包含span and div元素 虽然所有的div元素有display inline 应用样式 第一个div来自 p 从下一行开始 这是为什么 这是例子 http jsfiddle net 7
  • IE10选择框菜单显示上方

    我在 IE10 中测试我的应用程序 发现选择框有一个奇怪的行为 所选选项会突出显示 上方 下方选项会显示在所选选项的上方 下方 This happens only in IE10
  • 通过名称获取类

    如果我的应用程序中有一个名为 TestActivity 的 Activity 类 有没有办法通过名称获取其类 如下例所示 Class act Class forName com bla TestActivity catch ClassNot
  • 在不知道包名称的情况下加载特定文件夹中的所有类 - java

    我有一个代码加载具有相同包名称的文件夹中的所有类 second 我如何更改它以加载具有引用包的文件夹中的所有类 而不是在second 而且我们不知道包名 int classCounter 0 File folderAdded new Fil
  • 让我的文本框理解 html img 标签

    当在我的文本框中插入新的表情符号时 我希望显示为表情符号图像而不是表情符号符号 我怎样才能做到这一点而不是 gt 将代表它的图像放在我的文本框中 一种方法 使用文本框代替文本框 div div 当用户键入时 更改图像中笑脸的出现次数 提交表
  • 如何检查 JSON 数组是否等于

    我正在使用 JSON 和 Flot 创建饼图 创建饼图的 JS 函数从 Django 接收以下格式的 JSON 数组 1 3 2 5 4 如果没有数据 则 JSON 数组为 0 0 0 0 0 我正在尝试调整该函数 以便如果没有数据 则不会
  • 当 IDENTITY_INSERT 设置为 OFF 时,C# 无法在表“Rentals”中插入标识列的显式值

    我目前正在学习 ASP NET MVC 并且正在学习通过其 ID 获取对象并将其引用插入数据库 但是 我收到此错误 当 IDENTITY INSERT 设置为 OFF 时 无法在表 Rentals 中插入标识列的显式值 我读过周围的内容 注
  • 在 R 中使用 2 列映射数据帧来更改主数据帧中的值

    如果这是一个重复的问题 我很抱歉 我感觉有人问过这个问题 但我会提供一个很好的例子来帮助理解这一点 首先是演示数据帧 gt map df data frame name c nick mike joe tom id c 1 2 3 4 st
  • 用逗号格式化大数字

    我需要格式化一个数字 以便对于超过 包括 10000 的任何数字都用逗号分隔千位 例如 10000 变为 10 000 但 9999 仍保留为 9999 我想使用格式字符串来执行此操作 因为我不想测试数据以查看它是否在什么范围内 有谁知道如
  • 使用数据适配器更新记录时出现并发错误

    这是我的桌子 Student StudentId int PK autoincrement Name varchar 20 当我尝试更新最后添加的记录时 我收到错误 Error Concurrency violation the Updat
  • 将符号“%”替换为单词“百分比”

    如何用单词 百分比 替换符号 我的原始字符串是 内部 外部 该字符串应为 内部 百分比 外部 百分比 使用正则表达式 如何替换这个符号 提前致谢 阿图尔 这里不需要正则表达式 您可以使用常规替换 例如使用 net string s Inte
  • 在具有 5M+ 行的表上使用 ORDER 和 LIMIT 优化 SELECT ... UNION ... 查询

    我有一个大约 5M 行数据 文章 的表 我有以下查询 用于在两种不同语言的文章标题中进行全文搜索 问题是它需要大约 15 秒才能执行 MySQL version 5 6 29 log 这是查询 SELECT id title title f
  • Glassfish 5 忽略 JAXB @XmlJavaTypeAdapter 注释?

    我刚刚从 Glassfish 4 切换到 Glassfish 5 我注意到 Glassfish 不再调用我的 DateTimeAdapter 类的 unmarshal 方法 它在 Glassfish 4 中工作正常 Web 服务类接收 js
  • 当 url 以 & 符号结尾时.NET WebApi 中断

    我有一个 ApiController 例如 Home 控制器 其操作 Test 接受两个参数 test1 和 test2 两者都具有默认值 System Web Http HttpGet public ActionResult Test i