对象引用未设置为对象请求的实例.浏览器设置为null

本文关键字:设置 实例 浏览器 null 对象 对象引用 请求 | 更新日期: 2023-09-27 18:02:57

有人能告诉我们这段代码有什么问题吗(下面的代码发生在同一个叫做EntityNameBusinessLayer的类中,我们正在使用c# ASP。. NET MVC 5):

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Xml;
using System.Web;
using System.Web.Http;
using System.Web.UI;
using System.Web.UI.WebControls;
using Newtonsoft.Json;
using System.Globalization;
public HttpRequest Request { get; set; }
public HttpBrowserCapabilities Browser { get; set; }

公共类请求{private HttpRequest请求;

    public Request(HttpRequest request)
    {
        if(request.Browser == null)
        {
        }
        else
        {
        }
    }
}
public HttpBrowserCapabilities Browser { get; set; }
public  class ShogunTypeBusinessLayer
{
public string RetrieveUserBrowserDetails()
{               
    string browserSignature;
    HttpBrowserCapabilities browserCapabilities = Request.Browser;
    string typeBrowser = "Type : " + browserCapabilities.Type + " ";
    string nameBrowser = "Name = " + browserCapabilities.Browser + " ";
    string versionBrowser = "Version = " + browserCapabilities.Version + " ";
    string majorVersionBrowser = "Major Version = " + browserCapabilities.MajorVersion + " ";
    string minorVersionBrowser = "Minor Version = " + browserCapabilities.MinorVersion + " ";
    string browserCapabilitiesBrowser = "Platform = " + browserCapabilities.Platform + " ";
    string betaBrowser = "Is Beta = " + browserCapabilities.Beta + " ";
    string isCrawlerBrowser = "Is Crawler = " + browserCapabilities.Crawler +  " ";
    string isAOLBrowser = "Is AOL = " + browserCapabilities.AOL +  " ";
    string isWin16Browser = "Is Win16 = " + browserCapabilities.Win16 +  " ";
    string isWin32Browser = "Is Win32 = " + browserCapabilities.Win32 +  " ";
    string supportFramesBrowserStatus ="Supports Frames = " + browserCapabilities.Frames + " ";
    string supportTableBrowserStatus = "Supports Tables = " + browserCapabilities.Tables + " ";
    string supportCookiesBrowserStatus = "Supports Cookies = " + browserCapabilities.Cookies + " ";
    string supportVBScriptBrowserStatus = "Supports VB Script = " + browserCapabilities.VBScript + " ";
    string supportJavaScriptBrowserStatus = "Supports JavaScript = " + browserCapabilities.JavaScript + " ";
    string supportJavaAppletsBrowserStatus = "Supports Java Applets = " + browserCapabilities.JavaApplets + " ";
    string supportActiveXControlsBrowserStatus ="Supports ActiveX Controls = " + browserCapabilities.ActiveXControls + " ";
    string supportChannelDefinitionFormatBrowserStatus = "CDF = " + browserCapabilities.CDF + " ";
    browserSignature = typeBrowser + 
                       nameBrowser + 
                       versionBrowser + 
                       majorVersionBrowser + 
                       minorVersionBrowser + 
                       browserCapabilitiesBrowser + 
                       betaBrowser +
                       isCrawlerBrowser +
                       isAOLBrowser + 
                       isWin16Browser + 
                       isWin32Browser + 
                       supportFramesBrowserStatus + 
                       supportTableBrowserStatus +  
                       supportCookiesBrowserStatus + 
                       supportVBScriptBrowserStatus + 
                       supportJavaScriptBrowserStatus +  
                       supportJavaAppletsBrowserStatus + 
                       supportActiveXControlsBrowserStatus + 
                       supportChannelDefinitionFormatBrowserStatus;
    return browserSignature;
}

执行后,我们得到以下异常。我们正在尝试将附加的字符串保存到数据库中,以便能够确定是哪个浏览器完成了插入。

描述标题:对象引用未设置为对象的实例

描述:当前web请求执行过程中出现未处理的异常。请查看堆栈跟踪以获得有关错误及其在代码中的起源位置的更多信息。

Exception Details: System。NullReferenceException:对象引用没有设置为对象的实例。

源错误:

第791行:string browserSignature;792行:第793行:HttpBrowserCapabilities browserCapabilities = Request.Browser;794行:第795行:字符串typeBrowser = "Type: " + browserCapabilities。键入+ " ";

源文件:

c:'Users'25025'Documents'Visual Studio 2012'Projects'censys_cross'censys'BusinessLayer'ShogunTypeBusinessLayer.cs    Line:  793 

堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
   censys.BusinessLayer.ShogunTypeBusinessLayer.RetrieveUserBrowserDetails() in c:'Users'25025'Documents'Visual Studio 2012'Projects'censys_cross'censys'BusinessLayer'ShogunTypeBusinessLayer.cs:793
   censys.BusinessLayer.ShogunTypeBusinessLayer.AddShogunType(SHOGUN_TYPEda shogunType) in c:'Users'25025'Documents'Visual Studio 2012'Projects'censys_cross'censys'BusinessLayer'ShogunTypeBusinessLayer.cs:1124
   censys.Controllers.ShogunTypeController.Create_Post() in c:'Users'25025'Documents'Visual Studio 2012'Projects'censys_cross'censys'Controllers'ShogunTypeController.cs:33
   lambda_method(Closure , ControllerBase , Object[] ) +101
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +48
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +57
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +223
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +48
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651532
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

代码由于某种原因没有执行

对象引用未设置为对象请求的实例.浏览器设置为null

这段代码不能编译,因为c#不允许在类/类型中定义方法和属性。真的,你需要有一个类,这个类应该有一个构造函数,这个构造函数应该把Request实例作为参数,并在构造函数中执行空值检查。然后将Request属性设置为私有字段。这将确保:

  1. 调用者在运行时不会很难追踪到NRE。
  2. 代码早期失败
  3. 类型的要求是明确的,因为您不能创建具有坏状态(请求的空值)的有效实例

或者你可以让这个方法接受一个Request实例,并让它检查参数是否为空。

public class EntityNameBusinessLayer
{
    // private member, i left the naming the same but the usual convention for private members is camelcase and not pascal.
    private HttpRequest Request;
    // constructor
    public EntityNameBusinessLayer(HttpRequest request) {
        // check for null
        if(request == null)
            throw new ArgumentNullException("request");
        Request = request; // now the state of the instance is valid and it can be used by the caller
    }
    public string RetrieveUserBrowserDetails()
    { /*your code*/ }
}

调用asp.net web表单中的代码

public class YourAspWebPage : System.Web.UI.Page {
    protected void Button_Click(object sender, EventArgs args) {
        var bl = new EntityNameBusinessLayer(this.Request);
        var result = bl.RetrieveUserBrowserDetails();
    }
}

调用Asp.net Mvc控制器中的代码。注意,当您在Mvc中工作时,不鼓励直接使用类型HttpRequest。相反,使用类型HttpRequestBase,因为它很容易模拟/伪造单元测试。参见如何将HttpRequestBase转换为HttpRequest对象?, CountZero的第二个答案(票数最多的一个)。

public class YourController : System.Web.Mvc.Controller {
    public void SomeAction() {
        var bl = new EntityNameBusinessLayer(System.Web.HttpContext.Current.Request);
        var result = bl.RetrieveUserBrowserDetails();
    }
}