【问题标题】:Read cookies inside a static method [ ASP MVC ]在静态方法中读取 cookie [ASP MVC]
【发布时间】:2020-06-02 21:37:57
【问题描述】:

我在一个 ASP.NET MVC 项目上工作,我创建了一个名为 AuthenticationControllerController,此控制器包含一个名为 static methodUser_Access_Validation

此方法检查一些 cookies

这就是方法代码:

public void User_Access_Validation()
{
 if (Request.Cookies["X_8"] == null || Request.Cookies["X_5"] == null || Request.Cookies["X_T"] == null)
   {
     Response.Redirect("/Login");
   }
}

现在一切正常,但是当我将此方法更改为 static 方法时,我在 Visual Studio 的 ErrorList 中遇到了这 四个错误强>

Error   CS0120  An object reference is required for the non-static field, method, or property 

Error   CS0120  An object reference is required for the non-static field, method, or property 

Error   CS0120  An object reference is required for the non-static field, method, or property

Error   CS0120  An object reference is required for the non-static field, method, or property 

所以请我将此方法设为static 方法,并修复此错误

【问题讨论】:

  • Request 是一个实例属性。试试 HttpContext.Current.Request
  • 我试了一下,但 Current 没有在 Intellisense 中显示
  • 嗯。这段代码在哪里(你提到的控制器、api 方法、其他地方的某个类和 Request 不是我认为的那样)以及你使用的是什么版本的东西? docs.microsoft.com/en-us/dotnet/api/…
  • 是的,我使用控制器,但 Current 没有在智能感知中显示,Visual Studio 在它下方显示一个错误红色下划线
  • This answer 有助于在 ASP.NET Core 中提供对 HttpContext(包括请求和响应)的静态访问。这不容易获得,因为它不是一个好的模式。但是,正如答案中所述,在您需要将旧代码移动到新控制器中的情况下,它可能会有所帮助。我很好奇为什么它必须是静态的。但我明白了。有时我们只需要事情以某种方式表现。

标签: c# asp.net asp.net-mvc cookies


【解决方案1】:

正如Scott Hannen Montionned 在他的回答中一样,如果您需要使用static method,您应该使用ResponseRequest 对象作为参数,但我认为您的代码应该是这样的:

public static void User_Access_Validation(HttpRequestBase request, HttpResponseBase response)
{
 if (request.Cookies["X_8"] == null || request.Cookies["X_5"] == null || request.Cookies["X_T"] == null)
   {
     response.Redirect("/Login");
   }
}

这里有什么新鲜事?是参数应该baseHttpRequestBaseHttpResponseBase

我希望得到帮助。

【讨论】:

    【解决方案2】:

    RequestResponse 是实例属性 - 它们属于 Controller 的特定实例。

    static 方法不属于该类的任何特定实例。来自the documentation

    静态方法和属性不能访问其包含类型中的非静态字段和事件,并且它们不能访问任何对象的实例变量,除非它在方法参数中显式传递。

    我建议阅读更多内容。出于此答案的目的,您无法从静态方法访问 RequestResponse。正如文章所说,您可以做的是将它们作为参数传递给静态方法。所以你可以这样做:

    public static void User_Access_Validation(HttpRequest request, HttpResponse response)
    {
     if (request.Cookies["X_8"] == null || request.Cookies["X_5"] == null || request.Cookies["X_T"] == null)
       {
         response.Redirect("/Login");
       }
    }
    

    现在该方法不再尝试读取这些静态属性。它只是使用传递给它的方法。 (注意requestresponse 是小写的。它们指的是变量,而不是大写的属性。

    您可以从非静态(实例)方法调用此静态方法。可以访问这些属性的实例方法可以将它们作为参数传递给静态方法:

    public static void User_Access_Validation(Request, Response);
    

    Here's another good answer 解释了静态和实例(非静态)方法之间的区别。它有一个简单但很有启发性的例子。

    【讨论】:

    • 这个答案非常直白。从它的声音来看,除非是为了测验,否则它可能根本没有帮助。对不起。
    • 这是一个很好的答案,非常感谢兄弟您的时间和答案,我有最后一个问题我如何从 HttpRequestHttpResponse 创建对象以将它们传递给方法,原因这是我第一次与他们合作。
    • 如果您从非静态方法调用,则不必创建它们。您可以只传递RequestResponse。 (请参阅答案末尾的最后一个代码示例。)如果您从静态方法调用,那么我的回答没有帮助,因为您在同一个地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多