我这里有一个非常奇怪的案例。
我已经实现了Windows服务正在使用的wsDualHttpBinding WCF双工服务器。
服务器端的合同和实现定义如下:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FixServerContract : IFixContract
{
public FixServerContract()
{
}
public void Requestlogin(string message)
{
try
{
IServerCallback callback = OperationContext.Current.GetCallbackChannel<IServerCallback>();
callback.BroadcastToClient("Greetings from server");
}
catch (Exception ex)
{
}
}
[ServiceContract(CallbackContract=typeof(IServerCallback))]
public interface IFixContract
{
[OperationContract]
void Requestlogin(string message);
}
public interface IServerCallback
{
[OperationContract(IsOneWay = true)]
void BroadcastToClient(string eventData);
}
在客户端,我还有一个回调类,通过向Client项目添加Service Reference来访问附加的回调接口,如下所示:
class MyCallbackClass : IFixContractCallback
{
public void RegisterClient()
{
InstanceContext context = new InstanceContext(this);
FixContractClient proxy = new FixContractClient(context);
proxy.Requestlogin("hello");
}
public void BroadcastToClient(string eventData)
{
}
}
当proxy.RequestLogin(&#34; hello&#34;);由客户端调用,服务器应通过发信号通知BroadcastToClient(字符串eventData)
但是,这是特殊行为开始的地方!
当我的客户端直接从Main,Winform或WPF环境中调用RegisterClient时,一切正常。也就是说,RequestLogin被成功调用到服务器,服务器通过在客户端发信号通知BroadcastToClient成功响应。
此处显示:
[STAThread]
private static void Main(string[] args)
{
MyCallbackClass callbackClass = new MyCallbackClass();
callbackClass.RegisterClient();
}
但是,当我在 下面执行以下操作时,只需将上述行包装在Winform 中的button_Click处理程序中,此错误就会显示崩溃:
[STAThread]
private static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
然后按一下按钮就可以完成剩下的工作:
private void button1_Click(object sender, EventArgs e)
{
MyCallbackClass callbackClass = new MyCallbackClass();
callbackClass.RegisterClient();
}
然后出现以下错误:
1)在服务器端调用RequestLogin,但对BroadcastToClient的调用永远不会到达客户端。除此之外,RequestLogin永远不会返回到客户端,而是会因以下异常而超时:
2)未处理的类型&#39; System.TimeoutException&#39;发生在mscorlib.dll中。发送到XXXX的此请求操作未在配置的超时(00:00:59.6359791)内收到回复。分配给此操作的时间可能是较长超时的一部分。这可能是因为服务仍在处理操作,或者因为服务无法发送回复消息。请考虑增加操作超时(通过将通道/代理强制转换为IContextChannel并设置OperationTimeout属性)并确保该服务能够连接到客户端。
如果我使用WPF客户端,则会出现相同的行为。另一方面,如果我使用基于控制台的客户端,它会完美运行!
为什么我的Duplex Callback仅在Winform或WPF之外工作?
我该如何解决这个问题?
我在这里结束了我的目击。
感谢。
答案 0 :(得分:2)
感谢这位为我提供答案的人:
https://groups.google.com/forum/#!topic/microsoft.public.dotnet.framework.webservices/8Y6C8dRCFws
解决方案是修改MyCallbackClass,如下所示:
[CallbackBehavior(UseSynchronizationContext = false)]
class MyCallbackClass : IFixContractCallback
{
public void RegisterClient()
{
MyCallbackClass tester = this;
InstanceContext context = new InstanceContext(this);
FixContractClient proxy = new FixContractClient(context);
proxy.Requestlogin("hello");
}
public void BroadcastToClient(string eventData)
{
}
}