.net – 使用UrlHelper.Action方法生成网址时,引用异常

前端之家收集整理的这篇文章主要介绍了.net – 使用UrlHelper.Action方法生成网址时,引用异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
由于某些原因,当某些机器人访问该站点时,使用UrlHelper.Action方法生成URL将从System.Web.HttpServerVarsCollection.Get引发一个空异常.我做了一些调试,调用堆栈起源于尝试从HttpContextBase.Request.ServerVariables集合获取“HTTP_X_ORIGINAL_URL”.

如果我直接从浏览器访问相同的地址 – 没有问题.该页面是服务器,没有记录错误.它似乎只是在机器人访问时才发生.

不确定是否相关,但该网站刚刚迁移到IIS 7.5.仍然在集成模式下使用.NET 2.0.

看看Reflector反转的代码,唯一可以直接在Get方法中发生空异常的地方是调用this._request.FetchServerVariables.好像完整的请求没有正确设置.

有没有人面临这个问题或发现了一个解决方法?为什么在机器人访问时请求的设置会有所不同?

更新:一些额外的调试已经显示HttpServerVarsCollection被Dispose,以及它的父HttpRequest对象.现在的问题是 – HttpContext.Current返回的Request对象在请求完成之前如何被暴露?

HttpServerVarsCollection.Get方法

  1. public override string Get(string name)
  2. {
  3. if (!this._populated)
  4. {
  5. string simpleServerVar = this.GetSimpleServerVar(name);
  6. if (simpleServerVar != null)
  7. {
  8. return simpleServerVar;
  9. }
  10. this.Populate();
  11. }
  12. if (this._iis7workerRequest == null)
  13. {
  14. return this.GetServerVar(base.BaseGet(name));
  15. }
  16. string serverVar = this.GetServerVar(base.BaseGet(name));
  17. if (string.IsNullOrEmpty(serverVar))
  18. {
  19. // Only place null reference can happen
  20. serverVar = this._request.FetchServerVariable(name);
  21. }
  22. return serverVar;
  23. }

全堆栈跟踪

  1. NullReferenceException: Object reference not set to an instance of an object.]
  2. System.Web.HttpServerVarsCollection.Get(String name) +8645730
  3. System.Collections.Specialized.NameValueCollection.get_Item(String name) +7
  4. System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext,String contentPath) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\PathHelpers.cs:39
  5. System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext,String contentPath) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\PathHelpers.cs:21
  6. 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
  7. System.Web.Mvc.UrlHelper.GenerateUrl(String routeName,RouteValueDictionary routeValues) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\UrlHelper.cs:101
  8. System.Web.Mvc.UrlHelper.Action(String actionName,Object routeValues) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\UrlHelper.cs:51
  9. www.CmsExtensions.Document(UrlHelper urlHelper,String path) in C:\Dev\Site\www\Code\CmsExtensions.cs:33
  10. www.CmsExtensions.Document(UrlHelper urlHelper,Document document) in C:\Dev\Site\www\Code\CmsExtensions.cs:20
  11. www.<>c__DisplayClass17.<Load>b__c(Document d) in C:\Dev\Site\www\Global.asax.cs:251
  12. Fringine.Cms.DocumentContentParser.ReplaceDocumentRefs(IResolvingDocumentCache cache,Match match) +258
  13. Fringine.Cms.<>c__DisplayClass4.<ParseContent>b__2(Match m) +17
  14. System.Text.RegularExpressions.RegexReplacement.Replace(MatchEvaluator evaluator,Regex regex,String input,Int32 count,Int32 startat) +234
  15. System.Text.RegularExpressions.Regex.Replace(String input,MatchEvaluator evaluator,Int32 startat) +28
  16. System.Text.RegularExpressions.Regex.Replace(String input,MatchEvaluator evaluator) +38
  17. System.Text.RegularExpressions.Regex.Replace(String input,String pattern,RegexOptions options) +47
  18. Fringine.Cms.DocumentContentParser.ParseContent(String content,IResolvingDocumentCache cache) +83
  19. Fringine.Cms.ResolvingDocumentCache.<Parse>b__0(String d) +21
  20. Fringine.Cms.DocumentCache.GetParsedData(String id,String content,IDocumentService documentService,Func`2 parser) +216
  21. Fringine.Cms.ResolvingDocumentCache.Parse(String id,String content) +67
  22. Fringine.Cms.CachedDocument.GetSummary() +966
  23. Fringine.Cms.CachedDocument.get_Summary() +19
  24. ASP.views_document_widget_Feeddocumentsummary_ascx.__Render__control1(HtmlTextWriter __w,Control parameterContainer) +841
  25. System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) +256
  26. System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
  27. System.Web.UI.Control.Render(HtmlTextWriter writer) +10
  28. System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) +27
  29. System.Web.UI.Control.RenderControl(HtmlTextWriter writer,ControlAdapter adapter) +99
  30. System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
  31. System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) +134
  32. System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
  33. System.Web.UI.Page.Render(HtmlTextWriter writer) +29
  34. System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) in C:\Dev\Site\MVC\Microsoft\src\SystemWebMvc\Mvc\ViewPage.cs:107
  35. System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) +99
  36. System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
  37. System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) +1266

解决方法

我有这个问题,但它与URL重写模块无关.

在我的情况下,我不小心在静态字段中缓存了UrlHelper的一个实例,后来的请求从先前的请求中遇到了一个已处理的实例.

猜你在找的asp.Net相关文章