我正在尝试使用WCF服务制作扫雷游戏。看来我能够从客户端连接到服务,远程调用方法并获得返回的内容。
问题是,在服务端,我使用数组。每次客户端连接到服务时,该数组都应该自行更新,并且确实如此,但每次客户端连接时,数组都会重置为0,就好像有多个服务实例一样......
以下是您可能想要查看的代码:
在服务接口上,IService1.cs
public interface IDemineur
{
[OperationContract]
string CreationJoueur(string Name);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
Service1.svc
public class Service1 : IDemineur
{
Dictionary<int, Grille> Gamepad = new Dictionary<int, Grille>();
int[,] tableGrilles = new int[20, 3];
public string CreationJoueur(string Name)
{
string joueur = "";
for (int i = 0; i < 20; i++)
{
if (tableGrilles[i, 0] != 1)
{
tableGrilles[i, 0] = 1;
tableGrilles[i, 2] = i;
joueur = "1/" + tableGrilles[i, 2];
Gamepad.Add(i, new Grille());
break;
}
if (tableGrilles[i, 1] != 2)
{
tableGrilles[i, 1] = 2;
joueur = "2/" + tableGrilles[i, 2];
break;
}
}
return joueur;
}
这里,重点是更新数组tableGrilles。当我为主机运行调试时,我可以清楚地看到它确实更新了它,但每当我与另一个客户端连接时,它会在我的断点处再次进入调试模式,并且数组返回到0。
客户方:
public partial class DemineurGrille : Window
{
ServiceReference1.DemineurClient leDemineur;
int noJoueur;
int noGrille;
public DemineurGrille(string name)
{
InitializeComponent();
leDemineur = new ServiceReference1.DemineurClient("*");
string noJoueurGrille = leDemineur.CreationJoueur(name);
string[] leSplit = noJoueurGrille.Split('/');
noJoueur = Convert.ToInt32(leSplit[0]);
noGrille = Convert.ToInt32(leSplit[1]);
}
请帮忙,非常感谢...
答案 0 :(得分:1)
这是因为InstanceContextMode默认设置为PerSession。换句话说,每次连接客户端时都要创建一个新服务,因此对象将为空。
快速解决方案是将InstanceContextMode更改为Single,这意味着所有请求将共享一个实例,直到重置进程(网站)。但是,这意味着每个客户端都在更新相同的阵列,这可能不是您想要的。
更强大的解决方案是使用数据存储,例如数据库,它将为每个用户存储单独的数组,从而确保用户A更新阵列A,用户B更新阵列B等。
答案 1 :(得分:0)
这不是问题。您的断点可能会在另一个请求启动的另一个会话中被触发,并在另一个线程中。