在PreRequestHandlerExecute中,确定.asmx文件中的类名

时间:2011-07-06 00:17:15

标签: asp.net asmx ihttpmodule

最终,我正在尝试获取对处理请求之前处理请求的web方法的引用,以便检查其自定义属性。

目前,我通过将请求路径附加到项目命名空间,删除.asmx扩展名并用点替换斜杠来实现它。但是,这假设类命名空间层次结构与请求路径层次结构匹配,并且没有理由应该这样做。

没有打开文件并解析它 - 是否有一种方法可以给出asmx文件的请求路径,我可以检索对类中的类类型或类类型名称的引用?

.NET很新,所以我所做的可能很愚蠢。但无论哪种方式,我都会对答案感兴趣:)

编辑:这不是我的项目,而且它被锁定使用ASP.NET 3.5和asmx webservices

编辑:目的是能够阻止未经身份验证的用户执行某些Web服务,而无需向每个web方法添加身份验证代码。我的想法是在webmethods上使用自定义属性将它们标记为公共,并且只有那些将由未经身份验证的用户执行的自定义HTTP模块或处理程序允许。用户类型存储在会话中。

1 个答案:

答案 0 :(得分:1)

首先,我建议您切换到WCF Web服务,因为asmx现在被视为传统技术(请参阅MSDN)。 WCF在其管道中有几个扩展点,可以满足您的目标。

现在说,其中一个黑客解决方案可能是为asmx文件放置自己的处理程序或处理程序工厂,然后使用WebServiceParser.GetCompiledType方法获取实际的asmx服务类型,检查您的属性。然后,您可以使用WebServiceHandlerFactory.GetHandler创建实际处理程序并执行请求。

也许,您应该解释您想要使用自定义属性做什么,以便有人可以为您提供更好的解决方案。

编辑:如果您想要保护整个asmx或目录,那么可以很容易地使用内置授权 - 例如:

<location path="secure.asmx">
 <system.web>
   <authorization>
     <allow users="*" />
     <deny users="?" />
   </authorization>
 </system.web>
</location>

这将允许访问所有经过身份验证的用户并拒绝匿名用户。

如果你想在Web方法级别进行粒度控制,那么我建议将整个逻辑放在一个辅助方法中 - 比如说EnforceSecurity(在asmx的基本web服务调用上使用静态方法或实例方法)并调用相关网络方法中的辅助方法。它或多或少与你想做的相同 - 不是用自定义属性装饰方法,而是在其中插入一个方法调用。

相关问题