0

最终,我试图在处理请求之前获取对将处理请求的 webmethod 的引用,以检查其自定义属性。

目前,我通过将请求路径附加到项目命名空间、删除 .asmx 扩​​展名并用点替换斜杠来使其工作。但是,这假定类命名空间层次结构与请求路径层次结构相匹配,并且没有理由这样做。

缺少打开文件并对其进行解析 - 有没有一种方法可以给定 asmx 文件的请求路径,我可以检索对其中的类类型或类类型名称的引用?

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

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

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

4

1 回答 1

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 服务调用上的静态方法或实例方法)并在相关 Web 方法中调用辅助方法。它或多或少等同于您希望做的事情 - 您将在其中插入一个方法调用,而不是使用自定义属性装饰方法。

于 2011-07-06T05:01:01.597 回答