我正在创建一个WCF服务,并且在我的某些集成测试中使用它时会超时。我已经能够缩小它,并通过以下代码进行演示。看来在创建主机之前创建一个Form会导致问题,但我不确定原因。
class Program
{
[ServiceContract]
public interface IMyContract
{
[OperationContract]
void Ping();
}
public class MyContract : IMyContract
{
public void Ping()
{
Console.WriteLine("Ping");
}
}
public class MyContractProxy : ClientBase<IMyContract>, IMyContract
{
public MyContractProxy(int port)
: base(new NetTcpBinding { SendTimeout = TimeSpan.FromSeconds(5) }, new EndpointAddress(string.Format("net.tcp://localhost:{0}", port)))
{
}
public void Ping()
{
Channel.Ping();
}
}
static void Main(string[] args)
{
try
{
new Form();
var host = new ServiceHost(typeof(MyContract));
host.AddServiceEndpoint(typeof(IMyContract), new NetTcpBinding(), "net.tcp://localhost:12345");
host.Open();
var proxy = new MyContractProxy(12345);
proxy.Open();
proxy.Ping();
}
catch (Exception e)
{
Console.Error.WriteLine(e);
}
}
}
答案 0 :(得分:2)
表单更改服务的行为 - 您的代理和服务在同一个线程中运行。
UI线程和非UI线程中的托管服务存在差异。当您在非UI线程中托管服务时,服务会创建用于处理请求的新线程。如果您在UI线程中托管服务(如果您在那里运行任何WinForm或WPF表单会发生这种情况),默认情况下它不会使用新线程。相反,它会将调用作为标准Windows消息循环的一部分进行处理。
添加ServiceBehavior以避免此行为:
[ServiceBehavior(UseSynchronizationContext=false)]
public class MyContract : IMyContract
{ ... }