功能不适用于webservice

时间:2012-11-29 17:31:40

标签: c# asp.net vb.net socialauth

此代码段位于我的业务逻辑层类文件中:

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,因为它是基于会话的,当我尝试呼叫时,我收到此错误消息“对象引用未设置为对象的实例”来自webservice(asmx.vb)文件的SocialAuthUser.GetCurrentUser.GetProfile.ID。我称之为(ClassName.FunctionName - > BLL.getAccIDFromSocialAuthSession)

当我从aspx.vb页面调用相同的功能时,它可以正常工作但不是我从asmx.vb页面调用它时。

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

任何解决方案??

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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