双工WCF客户端不能与WinForms或WPF一起使用,但可以与Console一起使用

时间:2014-05-31 11:34:11

标签: wpf duplex

我这里有一个非常奇怪的案例。

我已经实现了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之外工作?

我该如何解决这个问题?

我在这里结束了我的目击。

感谢。

1 个答案:

答案 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)
    {           
    }
}