当 InstanceContextMode 设置为每个会话或每个调用时获取异常
Getting exceptions when InstanceContextMode is set to per session or per call
我正在尝试制作一个应用程序(用于学习目的),它可以登录并将创建 "user" 的实例,然后将其用户 ID 保存在其中。然后他们可以调用 getUserid 方法并获取他们保存的用户 ID。但是如果我使用单一的 InstanceContextMode,旧用户的 userid 将被新用户替换。所以我正在尝试按会话模式,但是当我在登录后调用 getUserid 方法时收到以下异常。
Server stack trace:
At System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at IService.getUserid()
at ServiceClient.getUserid()
这是我的服务代码 class。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service : IService
{
SqlConnection con;
SqlCommand command;
SqlDataReader sdr;
user loginUser;
public Service()
{
dataBase();
}
public bool Login(string username, string password)
{
command.CommandText = "select userid, password from chatuser where username = '" + username + "'";
sdr = command.ExecuteReader();
while (sdr.Read())
{
if (password.Equals(sdr.GetString(1)))
{
loginUser = new user(sdr.GetString(0));
return true;
}
}
return false;
}
public string getUserid()
{
return loginUser.Userid;
}
}
这是我的用户 class。
[DataContract]
public class user
{
string userid;
public user()
{
}
public user(string userid)
{
this.userid = userid;
}
[DataMember]
public string Userid
{
get { return userid; }
set { userid = value; }
}
}
这是我的界面 class。
[ServiceContract]
public interface IService
{
[OperationContract]
bool Login(string username, string password);
[OperationContract]
string getUserid();
}
将InstanceContextMode改成per session后出现错误,应用单机运行正常,但新的会替换旧的。那么它仍然应该设置为每个会话吗?还是我做错了什么?
我是自学 C# 的新手,所以如果我问了一些愚蠢的问题,我很抱歉。
I am using basicHttpsBinding
这就是问题所在,因为 basicHttpsBinding
不支持 Session
(默认情况下),因此如果您使用 PerSession
InstanceContextMode
它必然会抛出异常,因为那里没有会话。
在这种情况下,您应该使用 netTcpBinding
或 wsHttpBinding
,它具有 Session
设施
我正在尝试制作一个应用程序(用于学习目的),它可以登录并将创建 "user" 的实例,然后将其用户 ID 保存在其中。然后他们可以调用 getUserid 方法并获取他们保存的用户 ID。但是如果我使用单一的 InstanceContextMode,旧用户的 userid 将被新用户替换。所以我正在尝试按会话模式,但是当我在登录后调用 getUserid 方法时收到以下异常。
Server stack trace:
At System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at IService.getUserid()
at ServiceClient.getUserid()
这是我的服务代码 class。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service : IService
{
SqlConnection con;
SqlCommand command;
SqlDataReader sdr;
user loginUser;
public Service()
{
dataBase();
}
public bool Login(string username, string password)
{
command.CommandText = "select userid, password from chatuser where username = '" + username + "'";
sdr = command.ExecuteReader();
while (sdr.Read())
{
if (password.Equals(sdr.GetString(1)))
{
loginUser = new user(sdr.GetString(0));
return true;
}
}
return false;
}
public string getUserid()
{
return loginUser.Userid;
}
}
这是我的用户 class。
[DataContract]
public class user
{
string userid;
public user()
{
}
public user(string userid)
{
this.userid = userid;
}
[DataMember]
public string Userid
{
get { return userid; }
set { userid = value; }
}
}
这是我的界面 class。
[ServiceContract]
public interface IService
{
[OperationContract]
bool Login(string username, string password);
[OperationContract]
string getUserid();
}
将InstanceContextMode改成per session后出现错误,应用单机运行正常,但新的会替换旧的。那么它仍然应该设置为每个会话吗?还是我做错了什么?
我是自学 C# 的新手,所以如果我问了一些愚蠢的问题,我很抱歉。
I am using basicHttpsBinding
这就是问题所在,因为 basicHttpsBinding
不支持 Session
(默认情况下),因此如果您使用 PerSession
InstanceContextMode
它必然会抛出异常,因为那里没有会话。
在这种情况下,您应该使用 netTcpBinding
或 wsHttpBinding
,它具有 Session
设施