Vì một số lý do, khi một số bot truy cập trang web, tạo url với phương thức UrlHelper.Action
sẽ tăng ngoại lệ null từ System.Web.HttpServerVarsCollection.Get
. Tôi đã thực hiện một số gỡ lỗi và cuộc gọi ngăn xếp originiates với một nỗ lực để có được 'HTTP_X_ORIGINAL_URL' từ bộ sưu tập HttpContextBase.Request.ServerVariables
.Ngoại lệ tham chiếu Null khi tạo url bằng phương thức UrlHelper.Action
Nếu tôi truy cập cùng một địa chỉ trực tiếp từ trình duyệt - không sao cả. Trang này là máy chủ và không có lỗi nào được ghi lại. Nó dường như chỉ xảy ra khi một bot truy cập.
Bạn không chắc chắn nó có liên quan hay không, nhưng trang web vừa được di chuyển sang IIS 7.5. Vẫn đang sử dụng .NET 2.0 ở chế độ Tích hợp.
Nhìn vào mã được đảo ngược bởi Reflector nơi duy nhất có ngoại lệ null có thể xảy ra trực tiếp trong phương thức Get
là cuộc gọi đến this._request.FetchServerVariables
. Như thể yêu cầu hoàn chỉnh không được thiết lập đúng cách.
Có ai khác phải đối mặt với vấn đề này hoặc phát hiện ra giải pháp thay thế không? Tại sao yêu cầu sẽ được thiết lập khác khi được bot truy cập?
CẬP NHẬT: Một số gỡ lỗi bổ sung đã chỉ ra rằng HttpServerVarsCollection đã được xử lý, cùng với đối tượng HttpRequest cha mẹ của nó. Câu hỏi bây giờ là - làm thế nào để đối tượng Request được trả về bởi HttpContext.Current được tiếp xúc trước khi yêu cầu hoàn tất?
HttpServerVarsCollection.Get Phương pháp
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;
}
Full stack trace
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
'HttpContext.Current.Request' không được xử lý trước khi yêu cầu hoàn tất. Bạn có thể có mã mà nói 'sử dụng (HttpContext.Current.Request)' hoặc tương đương? –
Không ... đó là một trong số ít những điều tôi nghĩ ban đầu. Tôi đã xem xét tất cả các mã mà tôi có và không có gì làm cho một rõ ràng (hoặc ngầm thông qua sử dụng) gọi để Vứt bỏ trên đối tượng yêu cầu. Tuy nhiên tôi đã xác định thông qua gỡ lỗi nhiều hơn rằng nó chỉ xảy ra trong chế độ tích hợp IIS 7 - không phải trong cổ điển hoặc trong máy chủ phát triển ASP.NET. –
Thực ra tôi chỉ xác nhận trong IIS 7.5 o Windows 7 & 2008 R2. Chưa thực sự thử nghiệm IIs 7.0. –