我已经使用WCF服务构建了一个服务器:IService.cs和Service.cs。文件的代码如下:
Iservice.cs
[ServiceContract]
public interface ITaiKhoanNguoiChoi
{
[OperationContract]
void InsertStaff(string username);
}
Service.cs
public void InserStaff(string username)
{
try
{
conn = new SqlConnection(strConnect);
conn.Open();
cmd = new SqlCommand("insert into STAFF values('" + username+ "')", conn);
cmd.ExecuteNonQuery();
conn.Close();
}
catch
{
}
}
好的,这就是我建立的所有服务代码。然后,我将在我的客户端调用serveice,代码如下:
ServiceClient proxy = new ServiceClient();
private void btnInsert_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
proxy.InsertStaffCompleted += new EventHandler<AsyncCompletedEventArgs>(InsertStaffMethod);
proxy.InsertStaffAsync("John");
}
void InsertStaffMethod(object o, AsyncCompletedEventArgs e)
{
MessageBox.Show("YAY!");
}
现在,我第一次点击btnInsert,“YAY”将会显示1次。
在第二次单击btnInsert时,“YAY”将显示2次。
...
在第N次点击btnInsert时,“YAY”将显示N次。
这是我的问题。我不明白为什么我只点击一次,服务器上的InsertStaff方法将被多次调用。
你可以向我解释一下吗?以及如何解决问题。我只希望InsertStaff方法只在我点击btnInsert 1次时才执行。
答案 0 :(得分:1)
自从我使用WebForms事件生命周期以来已经有一段时间了,但我认为每次点击btnInsert时都会添加EventHandler,因此每次都会触发越来越多的事件。
解决方案是没有行
proxy.InsertStaffCompleted += new EventHandler<AsyncCompletedEventArgs>(InsertStaffMethod);
按钮单击处理程序中的。
创建代理,然后在表单加载事件中添加一次事件处理程序。
顺便说一下,如果这最终会因为生产代码要注意SQL注入的可能性:
cmd = new SqlCommand("insert into STAFF values('" + username+ "')", conn);