我有一个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请求时发生这种情况就会很重要。
答案 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中存在一个错误,当它处理格式错误的请求时会触发,例如编码了空字符的查询字符串,或类似的东西。
此外,您可以尝试使用Request.Path
或Request.FilePath
代替网址,或者暗示添加try-catch
并忘掉它。
答案 2 :(得分:0)
尝试这样做,应该没有问题:
if (httpContext.Request != null)
{
if (httpContext.Request.Url != null)
{
var url = httpContext.Request.Url;
}
}