出于某种原因,当某些漫游器访问该网站时,使用UrlHelper.Action
方法生成网址会引发System.Web.HttpServerVarsCollection.Get
的空例外。我做了一些调试,调用堆栈起源于尝试从HttpContextBase.Request.ServerVariables
集合中获取'HTTP_X_ORIGINAL_URL'。
如果我直接从浏览器访问同一地址 - 没问题。该页面是服务器,不记录任何错误。它似乎只发生在机器人访问时。
不确定它是否相关,但该网站刚刚迁移到IIS 7.5。仍在集成模式下使用.NET 2.0。
查看反射器反转的代码,Get
方法中唯一可以直接发生空异常的地方是对this._request.FetchServerVariables
的调用。好像没有正确设置完整的请求。
是否有其他人遇到此问题或发现了解决方法?为什么在机器人访问时请求的设置不同?
UPDATE :一些额外的调试显示HttpServerVarsCollection是Disposed,还有它的父HttpRequest对象。现在的问题是 - 如何在请求完成之前公开HttpContext.Current返回的Request对象?
HttpServerVarsCollection.Get方法
public override string Get(string name)
{
if (!this._populated)
{
string simpleServerVar = this.GetSimpleServerVar(name);
if (simpleServerVar != null)
{
return simpleServerVar;
}
this.Populate();
}
if (this._iis7workerRequest == null)
{
return this.GetServerVar(base.BaseGet(name));
}
string serverVar = this.GetServerVar(base.BaseGet(name));
if (string.IsNullOrEmpty(serverVar))
{
// Only place null reference can happen
serverVar = this._request.FetchServerVariable(name);
}
return serverVar;
}
完整堆栈跟踪
NullReferenceException: Object reference not set to an instance of an object.]
System.Web.HttpServerVarsCollection.Get(String name) +8645730
System.Collections.Specialized.NameValueCollection.get_Item(String name) +7
System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext, String contentPath) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\PathHelpers.cs:39
System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext, String contentPath) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\PathHelpers.cs:21
System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\UrlHelper.cs:136
System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\UrlHelper.cs:101
System.Web.Mvc.UrlHelper.Action(String actionName, String controllerName, Object routeValues) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\UrlHelper.cs:51
www.CmsExtensions.Document(UrlHelper urlHelper, String path) in C:\Dev\Site\www\Code\CmsExtensions.cs:33
www.CmsExtensions.Document(UrlHelper urlHelper, Document document) in C:\Dev\Site\www\Code\CmsExtensions.cs:20
www.<>c__DisplayClass17.<Load>b__c(Document d) in C:\Dev\Site\www\Global.asax.cs:251
Fringine.Cms.DocumentContentParser.ReplaceDocumentRefs(IResolvingDocumentCache cache, Match match) +258
Fringine.Cms.<>c__DisplayClass4.<ParseContent>b__2(Match m) +17
System.Text.RegularExpressions.RegexReplacement.Replace(MatchEvaluator evaluator, Regex regex, String input, Int32 count, Int32 startat) +234
System.Text.RegularExpressions.Regex.Replace(String input, MatchEvaluator evaluator, Int32 count, Int32 startat) +28
System.Text.RegularExpressions.Regex.Replace(String input, MatchEvaluator evaluator) +38
System.Text.RegularExpressions.Regex.Replace(String input, String pattern, MatchEvaluator evaluator, RegexOptions options) +47
Fringine.Cms.DocumentContentParser.ParseContent(String content, IResolvingDocumentCache cache) +83
Fringine.Cms.ResolvingDocumentCache.<Parse>b__0(String d) +21
Fringine.Cms.DocumentCache.GetParsedData(String id, String content, IDocumentService documentService, Func`2 parser) +216
Fringine.Cms.ResolvingDocumentCache.Parse(String id, String content) +67
Fringine.Cms.CachedDocument.GetSummary() +966
Fringine.Cms.CachedDocument.get_Summary() +19
ASP.views_document_widget_feeddocumentsummary_ascx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) +841
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +256
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
System.Web.UI.Control.Render(HtmlTextWriter writer) +10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +134
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
System.Web.UI.Page.Render(HtmlTextWriter writer) +29
System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\ViewPage.cs:107
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1266
答案 0 :(得分:3)
我遇到了这个问题,但它与URL重写模块无关。
在我的情况下,我意外地在静态字段中缓存了UrlHelper的一个实例,后来的请求遇到了先前请求中的已处置实例。
答案 1 :(得分:1)
我知道这个问题现在已经很老了,但我最近发现自己处于一个非常类似的情况,我的UrlHelper也在System.Web.HttpServerVarsCollection.Get上给了我空引用异常。
问题确实是HTTP_X_ORIGINAL_URL,这个特定的服务器变量来自IIS上的 URL Rewrite 2.0 Module 。
有趣的是,这个模块已经安装但没有被使用。然而,只是它的存在足以导致问题。卸载它会使错误消失。
如果您需要进行URL重写,那么还有其他模块,或者您可以在应用程序级别进行。
希望有所帮助。
答案 2 :(得分:1)
我碰到了这个,在我的情况下能够通过切换到UrlHelper的非扩展方法使用来解决。我有一个扩展方法调用另一个,但将UrlHelper传递给第二个方法。
这种方式被打破了:
public static string Script(this UrlHelper helper, string fileName)
{
return Asset(helper, "~/js/", fileName);
}
private static string Asset(this UrlHelper helper, string path, string fileName)
{
return helper.Content(string.Format("{0}/{1}/{2}",
path,
Version,
fileName));
}
这种方式有效:
public static string Script(this UrlHelper helper, string fileName)
{
return Asset(helper, "~/js/", fileName);
}
private static string Asset(UrlHelper helper, string path, string fileName)
{
return helper.Content(string.Format("{0}/{1}/{2}",
path,
Version,
fileName));
}
注意Asset方法的函数签名差异。