我使用实体框架和 WCF 创建了一个简单的测试解决方案。我在服务合同中只有一个函数,称为GetAllCustomers()
从数据库中检索客户并将其返回给客户端。客户端应用程序调用该函数并将客户名称写入控制台。
当我GetAllCustomers()
通过代理从客户端调用时,我收到一条CommunicationException
消息,
接收对 的 HTTP 响应时出错
http://localhost:8000/Service1
。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关更多详细信息,请参阅服务器日志。
内部例外是System.Net.WebException
:
底层连接已关闭:接收时发生意外错误。
内部异常的下一级是System.IO.IOException
:
无法从传输连接读取数据:现有连接被远程主机强行关闭。
最后的内部异常是System.Net.Sockets.SocketException
:
现有连接被远程主机强行关闭
这是客户端代码:
static void Main(string[] args)
{
Console.WriteLine("Press Enter to begin.");
Console.ReadLine();
ServiceReference1.Service1Client MyService = new ServiceReference1.Service1Client();
CUSTOMER[] cl = MyService.GetAllCustomers();
foreach (CUSTOMER c in cl)
{
Console.WriteLine(c.CUSTFNAME + " " + c.CUSTLNAME);
}
Console.WriteLine("Press Enter to exit.");
Console.ReadLine();
}
这是主机应用程序代码:
static void Main(string[] args)
{
ServiceHost hostA = null;
try
{
hostA = new ServiceHost(typeof(Service1), new Uri("http://localhost:8000") );
hostA.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "Service1");
hostA.Open();
Console.WriteLine();
Console.WriteLine("Host started. Press Enter to terminate host.");
Console.ReadLine();
}
finally
{
if (hostA.State == CommunicationState.Faulted)
hostA.Abort();
else
hostA.Close();
}
}
这是该函数的服务库代码:
public HashSet<CUSTOMER> GetAllCustomers()
{
var db = new TRS11Entities();
HashSet<CUSTOMER> TheCusts = new HashSet<CUSTOMER>();
foreach (CUSTOMER c in db.CUSTOMERs)
{
TheCusts.Add(c);
}
//CUSTOMER TestCust1 = new CUSTOMER();
//TestCust1.CUSTFNAME = "Joe";
//TestCust1.CUSTLNAME = "Schmoe";
//CUSTOMER TestCust2 = new CUSTOMER();
//TestCust2.CUSTFNAME = "Peter";
//TestCust2.CUSTLNAME = "Pumpkineater";
//TheCusts.Add(TestCust1);
//System.Threading.Thread.Sleep(45000);
//TheCusts.Add(TestCust2);
return TheCusts;
}
奇怪的是,如果我通过用下面注释掉的代码替换 foreach 块来绕过数据库,它会很好用!
我首先认为这可能是数据库查询时间过长的超时问题。但是,我的测试代码在那里有 45 秒的睡眠,它仍然可以将数据返回给客户端。原始代码仅在大约 3 秒后给出异常。
此外,如果我通过直接实例化 WCF 服务而不是通过端点/代理来调用原始函数(使用 foreach 块),它也可以正常运行并返回数据库中的所有客户。
最后,我认为可能是返回的数据集太大的问题,所以我修改了foreach块并在将前5个客户添加到结果后插入了一个break语句,我仍然得到了异常。
那么,还有什么可能导致这种情况?