C# SQL Compact只允许一个WCF客户端
我写了一个小聊天应用程序。为了保存用户名和密码等信息,我将数据存储在SQLCompact3.5SP1数据库中 一切正常,但如果另一个(同一台机器上的相同.exe)客户端想要访问该服务。它来自第二个客户端的ServiceReference.Class.Open()中的EndpointNotFound异常 因此,我删除了CE数据访问代码,没有得到任何错误(带有if(false)) 问题在哪里? 我在谷歌上搜索过这个,但没有人会像我一样出错:( 解决方案 我用过包装纸 对于威胁安全,现在它起作用了:)C# SQL Compact只允许一个WCF客户端,c#,sql-server-ce,data-access,C#,Sql Server Ce,Data Access,我写了一个小聊天应用程序。为了保存用户名和密码等信息,我将数据存储在SQLCompact3.5SP1数据库中 一切正常,但如果另一个(同一台机器上的相同.exe)客户端想要访问该服务。它来自第二个客户端的ServiceReference.Class.Open()中的EndpointNotFound异常 因此,我删除了CE数据访问代码,没有得到任何错误(带有if(false)) 问题在哪里? 我在谷歌上搜索过这个,但没有人会像我一样出错:( 解决方案 我用过包装纸 对于威胁安全,现在它起作用了:)
客户端代码:
public test()
{
var newCompositeType = new Client.ServiceReference1.CompositeType();
newCompositeType.StringValue = "Hallo" + DateTime.Now.ToLongTimeString();
newCompositeType.Save = (Console.ReadKey().Key == ConsoleKey.J);
ServiceReference1.Service1Client sc = new Client.ServiceReference1.Service1Client();
sc.Open();
Console.WriteLine("Save " + newCompositeType.StringValue);
sc.GetDataUsingDataContract(newCompositeType);
sc.Close();
}
服务器代码
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.Save)
{
SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.Con);
con.Open();
var com = con.CreateCommand();
com.CommandText = "SELECT * FROM TEST";
SqlCeResultSet result = com.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
var rec = result.CreateRecord();
rec["TextField"] = composite.StringValue;
result.Insert(rec);
result.Close();
result.Dispose();
com.Dispose();
con.Close();
con.Dispose();
}
return composite;
}
在处理
con
对象之前,您不会关闭连接
尝试:
当第二个客户端连接时,可能在服务初始化期间发生异常。在运行第二个exe的同时调试服务 将VS中的异常行为设置为在引发公共语言运行时异常以及未处理这些异常时中断,您将看到错误
正如tomlog的回答所述——这可能是因为您没有正确关闭连接。我在中使用了包装器以保护威胁安全,现在它可以工作了:)感谢您的快速响应。我试过这个,但没有效果。我把它注释掉,它就运行了,但缺少了一些东西。我也尝试了Enity框架,同样的行为。SqlCeResultSet result=com.executesultset(ResultSetOptions.Scrollable | ResultSetOptions.updateable);var rec=result.CreateRecord();rec[“TextField”]=composite.StringValue;结果:插入(rec);感谢我找到了一个解决方案,问题在于多线程。我设置了一个断点,它不会出现在服务器代码的第一行。有一次它现在运行,如果我设置了一些断点,请调试它:(是否打开了所有异常(调试->异常->勾选常见Language运行时异常旁边的“抛出”复选框)。我的理论是,它在尝试初始化第二个客户端的服务实例时抛出了一个异常,然后爆炸。WCF将吞下该异常,因此您需要启用“所有异常中断”。感谢Andras,我尝试了这个,但没有结果。我找到了一个解决方案。我编写了一个具有相同功能的控制台应用程序,no添加时出错:(我现在不知道它来自何方……WCF有什么不同?我在中使用了包装器以实现威胁安全,现在它可以进行一些更改,并且工作得非常好:)
con.Close();
con.Dispose();