尝试访问Request.Url时,ASP.NET HttpModule失败,出现NullReference异常

时间:2017-03-09 23:23:34

标签: asp.net httprequest nullreferenceexception httpcontext httpmodule

我有一个HttpModule来处理每个HttpRequest的自定义逻辑,出于某些原因,在极少数情况下,当我尝试访问{{1}时,它会抛出NullReferenceException错误}。

在访问HttpRequest.Url之前,我正在检查Url是否存在且HttpContext对象不为空。这是堆栈跟踪:

Request

我还检查了.NET源代码以获取更多信息,但无法为NullReference找到一个位置:

https://referencesource.microsoft.com/#System.Web/Hosting/IIS7WorkerRequest.cs,68b1222d24e7bd28

以下是代码:

[NullReferenceException: Object reference not set to an instance of an object.] 
    System.Web.Hosting.IIS7WorkerRequest.GetQueryStringRawBytes() +55 
    System.Web.HttpRequest.get_QueryStringText() +76 
    System.Web.HttpRequest.BuildUrl(Func`1 pathAccessor) +42 
    System.Web.HttpRequest.get_Url() +88 
    MyHttpModule.BeginRequestEventHandler(Object sender, EventArgs e) at +xx      
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +175 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +168 

这种情况在极少数情况下会发生,但只要在处理常规http请求时发生这种情况就会很重要。

3 个答案:

答案 0 :(得分:1)

您可以尝试从HttpContext获取HttpContext.Current吗?

public class MyHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += this.BeginRequestEventHandler;
    }

    private void BeginRequestEventHandler(object sender, EventArgs e)
    {
        var httpContext = HttpContext.Current;
        ...
    }
}

答案 1 :(得分:1)

正如我们从堆栈跟踪中看到的,当.NET框架尝试从上下文中提取Query-string时,代码失败。看一下代码,似乎unsafe代码抛出异常,这意味着某个指针在某处被设置为零。

我认为IIS中存在一个错误,当它处理格式错误的请求时会触发,例如编码了空字符的查询字符串,或类似的东西。

确保安装所有IIS修补程序https://social.technet.microsoft.com/wiki/contents/articles/19863.list-of-iis-7-5-related-hotfixes-post-sp1-for-windows-7-sp1-and-windows-server-2008-r2-sp1.aspx

此外,您可以尝试使用Request.PathRequest.FilePath代替网址,或者暗示添加try-catch并忘掉它。

答案 2 :(得分:0)

尝试这样做,应该没有问题:

if (httpContext.Request != null)
{
    if (httpContext.Request.Url != null)
    {
        var url = httpContext.Request.Url;
    }
}