2008-11-13 40 views
3

我有一个应用程序必须处理在其URL中获取“特殊”字符(如&,+,%等)。当我使用这些字符向应用程序发送请求时(当然,我将它们发送给他们)我得到“错误请求”响应代码,并显示“ASP.NET在URL中检测到无效字符”消息。跟踪请求向我显示错误是从“身份验证模块”抛出的。在IIS 7上使用HttpHandler取消请求验证

我搜索了一下,发现每个页面都有一个ValidateRequest,并将其值更改为false可以解决问题。不幸的是我使用Httphandler。有谁知道如何使用http处理程序停止请求验证?

回答

2

我遇到了同样的问题(创建的IHttpHandler一个需要接受在URL中的特殊字符的请求)。我必须做两两件事来解决这个问题:

  1. 创建值为1以下DWORD注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility

  2. 在web.config中,的requestFiltering元素的allowDoubleEscaping属性设置为真正。

-1

您可以在web.config的pages部分中将validateRequest设置为false。也许这也适用于HttpHandlers?

+0

我试过了。它不工作... – Itay 2008-11-13 14:36:19

0

您可以删除所有模块与

<httpModules> 
    <clear /> 
</httpModule> 

发出请求到您的处理程序。或者,也许您可​​以删除停止请求的特定模块。

这是模块列表从here

<httpModules> 
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" /> 
    <add name="Session" type="System.Web.SessionState.SessionStateModule" /> 
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" /> 
    <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" /> 
    <add name="Profile" type="System.Web.Profile.ProfileModule" /> 
</httpModules> 
+0

感谢您的答案,但问题是,有一些必要的模块验证网址,所以我需要找出如何删除验证,而不是模块... – Itay 2008-11-13 16:06:42

0

这个怎么样加载默认情况下,ASP.NET 2.0?

<system.web> 
    <pages validateRequest="false"> 
    </pages> 
</system.web> 
1

以下解决方案为我 - 创建具有的值为1以下DWORD注册条目:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility

web.config,所述requestFiltering元件的allowDoubleEscaping属性设置为true

1

我有同样的问题,并通过设置validateRequest =“false”以及requestValidationMode =“2.0”,如下所示得到它的工作。没有注册表编辑。

<system.web> 
    <httpRuntime requestValidationMode="2.0" /> 
    ... 
    <pages ... validateRequest="false" /> 
</system.web> 
2

在应用程序或机器级别的批量更改是我不能接受的。我只有一个参数,客户端发送错误,我需要擦洗。

我发现使用html或查询字符串中的其他潜在危险项目发出请求时,可以使用context.Request.RawUrl来擦除字符串,并且在查询字符串被擦除后使用context.RewritePath(scrubbedUrl)

  1. 在处理程序中的第一件事情,得到了context.Request.RawUrl
  2. 磨砂坏输入错误的请求RawUrl
  3. context.RewritePath(srubbedUrl)
  4. 利润

好像请求验证只在乎访问context.Request.Params[] ,因此如果在访问Params集合之前擦洗并重写路径(到相同的路径),那么您就是黄金。

0

由于.NET Framework 4.5,您可以使用HttpRequestHttpRequestBase上的Unvalidated属性以不会触发请求验证的方式访问表单,查询字符串和URL数据。如果您避免以任何其他方式(包括在相同请求中运行的帮助程序方法或其他HTTP模块中)访问这些值,则不需要任何其他方法来避免请求验证。