0

我正在尝试使用 Microsoft 的此示例实现会话状态提供程序:

http://msdn.microsoft.com/en-us/library/ms178589.aspx

但我无法编译它,因为 .NET 会抛出此错误:

Error   1   
'Project.Session.OdbcSessionStateStore' does not implement inherited abstract member     'System.Web.SessionState.SessionStateStoreProviderBase.CreateNewStoreData(System.Web.HttpContext, int)'

Error   2   'Project.Session.OdbcSessionStateStore.CreateNewStoreData(System.Web.HttpContext, double)' is a new virtual member in sealed class 'Project.Session.OdbcSessionStateStore'

Error   3   'Project.Session.OdbcSessionStateStore.CreateNewStoreData(System.Web.HttpContext, double)': no suitable method found to override

具有 CreateNewStoreData 覆盖的确切代码:

    //
    // SessionStateProviderBase.CreateNewStoreData
    //

    public override SessionStateStoreData CreateNewStoreData(
      HttpContext context,
      double timeout)
    {
        return new SessionStateStoreData(new SessionStateItemCollection(),
          SessionStateUtility.GetSessionStaticObjects(context),
          (int)timeout);
    }
4

2 回答 2

2

样本中有错误。您需要更改SessionStateStoreData方法签名以使用 int 作为 timeout 参数,因为这就是基类中方法签名的定义方式。(这个类重写了基方法,所以方法签名必须相同。)

      public override SessionStateStoreData CreateNewStoreData(
          HttpContext context,
          int timeout)

这意味着您还必须确保传递给此方法的参数是 int,而不是 double。我相信示例类在 GetSessionStoreItem 中只包含一个调用。您所要做的就是将值转换为 int,如下所示:

      if (actionFlags == SessionStateActions.InitializeItem)
          item = CreateNewStoreData(context, (int) pConfig.Timeout.TotalMinutes);
      else
          item = Deserialize(context, serializedItems, timeout);
于 2013-03-22T03:26:26.680 回答
2

从您的 MSDN 链接,类OdbcSessionStateStore继承自SessionStateStoreProviderBase抽象类。点击这里了解更多信息

由于您必须重写抽象类中的所有抽象方法(除非您创建的类也是抽象类),因此在此示例中您将需要重写抽象方法CreateNewStoreData点击这里了解更多信息

覆盖方法签名时应该匹配。在您的 MSDN 链接的示例代码中,签名是

public override SessionStateStoreData CreateNewStoreData(
      HttpContext context,
      double timeout)

在实际情况下应该在哪里

public override SessionStateStoreData CreateNewStoreData(
    HttpContext context,
    int timeout
)

注意区别double timeout而不是int timeout

于 2013-03-22T03:27:16.357 回答