1

这个片段在我的业务逻辑层类文件中:

Public Shared Function getAccIDFromSocialAuthSession() As Object
        Dim db As SqlDatabase = Connection.connection
        Dim accID As Integer
        If SocialAuthUser.IsLoggedIn Then
            Using cmd As SqlCommand = db.GetSqlStringCommand("SELECT AccountID FROM UserAccounts WHERE FBID=@fbID")
                db.AddInParameter(cmd, "fbID", SqlDbType.VarChar, SocialAuthUser.GetCurrentUser.GetProfile.ID)
                accID = db.ExecuteScalar(cmd)
            End Using
        End If

        Return accID
    End Function

我正在使用SocialAuth.NetSocialAuth.NET将所有内容存储在会话中。例如,要获取我们调用的 Facebook 用户 ID SocialAuthUser.GetCurrentUser.GetProfile.ID,因为它是基于会话的,所以当我尝试从 web 服务 (asmx.vb) 文件调用时,我会收到此错误消息“对象引用未设置为对象的实例” 。SocialAuthUser.GetCurrentUser.GetProfile.ID我这样称呼它(ClassName.FunctionName-->BLL.getAccIDFromSocialAuthSession)

当我从页面调用相同的函数时,aspx.vb它可以正常工作,但当我从asmx.vb页面调用它时却不行。

由于我不知道会话变量名称,我无法使用System.Web.HttpContext.Current.Session("NameHere")

有什么解决办法??

4

2 回答 2

2

这是一些工作代码的开始:

Imports System.Web.Services
Imports System.ComponentModel

<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class LightboxService
    Inherits WebService

    <WebMethod(EnableSession:=True)> _
    Public Function AddToLightbox(ByVal filename As String) As String
        Dim user As String = CStr(Session("username"))

'...etc.
于 2012-11-29T19:14:36.597 回答
0

听起来您需要Implements IRequiresSessionState在服务类上实现。

没有这个,再多的调用HttpContext.Current.Session("NameHere")都不起作用。

示例:(伪代码)

    <WebService(Namespace:="http://tempuri.org/")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> 
    <System.Web.Script.Services.ScriptService()>
    Public Class MyService
            Inherits System.Web.Services.WebService
            Implements IRequiresSessionState '' <-- This is the part you need

            '' Code in here
    End Class

更新

我无法澄清,尽管它可能不适用于您的网络服务。Web 服务是无状态的。这意味着它独立于您的实际网站运行。因此,无论SocialAuthUser何时实例化,网络服务器都不会对此一无所知。它在那里运行它自己的独立代码。

另一个更新

在这种情况下,不要使用 Web 服务,而是尝试在您的 .aspx 页面代码隐藏上使用 Web 方法。

所以是这样的:

     <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> <Services.WebMethod(EnableSession:=True)> _
     Public Shared Function getAccIDFromSocialAuthSession() As Object
          Dim db As SqlDatabase = Connection.connection
          Dim accID As Integer
          If SocialAuthUser.IsLoggedIn Then
              Using cmd As SqlCommand = db.GetSqlStringCommand("SELECT AccountID FROM UserAccounts WHERE FBID=@fbID")
                  db.AddInParameter(cmd, "fbID", SqlDbType.VarChar, SocialAuthUser.GetCurrentUser.GetProfile.ID)
                  accID = db.ExecuteScalar(cmd)
              End Using
          End If

        Return accID
    End Function
于 2012-11-29T17:36:23.827 回答