我如何判断特定的控制器操作需要 POST 还是 GET?

How can I tell whether a specific controller action expects POST or GET?

在使用ASP.NET标识的标准MVC项目中,未经授权的请求被重定向到登录页面,并在查询字符串中添加一个ReturnUrl参数,以便在成功登录后进一步可以重定向到最初请求的页面。

帐户控制器包含一个名为 RedirectToLocal 的方法,仅当 ReturnUrl 参数引用本地 URL(即来自同一网站的页面)时才用于执行第二次重定向).它使用非常简单的方法来执行此检查,并且不检查(例如)URL 是否有效 URL,或者它是否可以路由到操作。

就我而言,有一些 URL 我绝对不想重定向到,例如注销页面 (!)。我还想仅重定向到可以成功路由的 URLs。

为了实现这一点,我更改了代码以将 URL 变成一条路线(使用类似于 this 的技术)。这让我得到一个 RouteData 对象,它允许我检查控制器和动作名称(因此让我排除某些被阻止的动作)。

我想更进一步,排除任何需要 POST 数据的控制器操作(因为您无法重定向到这些操作)。所以...

给定控制器名称和操作名称,我如何判断这是 GET 操作还是 POST 操作?

有没有什么方法可以调用 MVC 框架通常会执行的 routing/binding,直到它实际执行操作之前?

可能的解决方案,将 [Get]、[Post] 属性添加到操作并使用反射将其过滤掉。

不知道除了反射和属性之外,框架中是否内置了一些机制。

另一种解决方案。创建一个约定,所有操作在操作名称中都有 http 方法名称,并使用正则表达式查找它。

我不相信有内置功能可以做你想做的事。

我刚刚快速浏览了 ASP.NET MVC 5 源代码 (System.Web.Mvc.dll)(使用 dotPeek)以查看 [HttpPostAttribute] 的使用位置。坦率地说,与确定操作方法是否可用于服务传入请求有关的所有事情都是即时完成的。与此一样,没有高级扩展方法或助手 类 参与该决定。至少,从我所看到的来看,没有什么是显而易见的。在我看来,它更像是内部 methods/helpers 用于确定操作方法是否可以满足请求。

至于如何实现你的主要目标,我不太确定,但我想我会提到我在扫描源代码后发现的内容。当然,您可以随意查看源代码,您可能会发现我遗漏的内容。在这种情况下,请 post 在这里找到您的发现,以帮助将来可能有相同需求的其他人。