【问题标题】:How do I restrict POST access to a HttpHandler?如何限制对 HttpHandler 的 POST 访问?
【发布时间】:2015-11-06 18:23:56
【问题描述】:

我的 asp.net Web 项目中有一些 http 处理程序 (IHttpHandler)。现在我想限制对这些处理程序的访问。对于 Handler1 我只想允许 POST 请求,而对于 Handler2 我只想允许 GET 请求。

在我的web.config 中,我修改了 部分,如下所示,但两个处理程序仍处理所有动词类型​​。有什么我错过的吗?我正在使用 IIS Express 对其进行测试。

<httpHandlers>
  <add verb="POST" path="Handler1.ashx" type="MyNamesapce.Handler1, MyAssembly"/>
  <add verb="GET" path="Handler2.ashx" type="MyNamesapce.Handler2, MyAssembly"/>
</httpHandlers>

【问题讨论】:

    标签: c# asp.net httphandler


    【解决方案1】:

    这对您不起作用的原因是您将实现 IHttpHandler 的东西的两种略有不同的“风味”混为一谈。

    有两种方法可以用 asp.net 实现 IHttpHandler:

    • 创建一个实现IHttpHandler的类,例如MyCustomHandler.cs。这种类型的处理程序不会响应任何请求,除非您在 web.config 文件中进行配置。
    • 创建一个.ashx 文件(看起来你已经完成了),例如MyOtherHandler.ashx。这种类型的处理程序将响应对其 URL 的任何请求,例如http://localhost/MyOtherHandler.ashx

    第一种类型需要 web.config 文件中的条目才能工作,第二种不需要。这就是为什么您会看到 .ashx 处理程序响应所有 HTTP 动词的原因,因为它们是由响应 .ashx 文件请求的 asp.net 框架的一部分处理的,而不是由您的 Web 触发的。配置文件。如果您使用的是 IIS Express,您可以在文件 %USERPROFILE%\Documents\IISExpress\config\applicationhost.config 中看到此配置。搜索“.ashx”,您会在&lt;system.webServer&gt;&lt;handlers&gt; 部分找到类似于以下内容的行:

    <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx"
         verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" 
         preCondition="integratedMode,runtimeVersionv4.0" />
    

    这等同于您添加到 web.config 中的内容,但它负责告诉 IIS/asp.net“使用列出的任何动词响应以 .ashx 结尾的任何 URL,方法是使用代码在System.Web.UI.SimpleHandlerFactory 类型中处理它。然后此代码会加载您的.ashx 文件。

    要创建一个可以响应您选择的任何地址的处理程序,您需要(简而言之)一个包含类似于以下内容的.cs 文件:

    using System.Web;
    
    namespace HttpHandlers
    {
        public class Handler4 : IHttpHandler
        {
            public bool IsReusable
            {
                get { return true; }
            }
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.Write("Hello World from Handler4.cs");
            }
        }
    }
    

    然后您可以将其连接到您的 web.config 文件中:

    <add name="Handler4" verb="POST" path="Handler4.ashx" type="HttpHandlers.Handler4, HttpHandlers" />
    

    注意:我为测试它而创建的项目称为“HttpHandlers”,因此我在该 web.config sn-p 中指定了类型声明。

    【讨论】:

    • @IgorGoroshko,很高兴为您提供帮助 :) 希望它的工作和清晰! :)
    • 我希望如此,但不幸的是现在我收到 404 错误。无法找到该资源。我还需要做什么吗?或者因为我使用的是 IIS Express,所以它不起作用?
    • 好的,我发现了问题,我在 中添加处理程序配置,但必须添加到
    • @IgorGoroshko,啊,是的,就可以了! &lt;system.web&gt; 是在经典/IIS6 模式下运行时用于配置的“旧版”容器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2021-12-06
    • 2020-01-15
    • 2016-10-18
    • 1970-01-01
    • 2018-09-17
    相关资源
    最近更新 更多