【问题标题】:Help with WCF Service and Windows Application Client [duplicate]WCF 服务和 Windows 应用程序客户端的帮助 [重复]
【发布时间】:2011-09-26 17:28:46
【问题描述】:

我已经在互联网上浏览了一段时间,但找不到任何适合我的确切问题的东西。如果有人能简明扼要地解释一下,我将不胜感激。

基本上我想从我的客户端(Windows 应用程序)调用 WCF Web 服务,该服务将执行更新。但是,我希望服务以进度“回调”到客户端,以便用户可以通过可视进度条看到正在发生的事情。这个可以吗?

我已经研究了其中包含回调的全双工 WCF 服务的想法,并尝试编写一些代码,但实际上并没有真正让这些回调触发,我大致了解 wsDualHttpBinding 和netTcpBinding 但两者都无法真正工作。

目前我的测试在同一个盒子上运行,即 Windows 应用程序和 WCF 服务(运行 http://localhost:58781/)。我知道一旦将这些转移到生产环境中,我可能会遇到更多问题,因此我希望现在考虑这些问题。

对此的任何帮助将不胜感激。

【问题讨论】:

  • 一定要看看 GertArnold 添加的链接

标签: c# winforms wcf web-services duplex


【解决方案1】:

这是一个带有自托管服务和客户端的准系统示例。

合同

[ServiceContract(CallbackContract = typeof(IService1Callback), SessionMode=SessionMode.Required)]
public interface IService1
{
    [OperationContract]
    void Process(string what);
}

public interface IService1Callback
{
    [OperationContract]
    void Progress(string what, decimal percentDone);
}

服务器

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
    public void Process(string what)
    {
        Console.WriteLine("I'm processing {0}", what);
        for (int i = 0; i < 10; i++)
        {
            OperationContext.Current.GetCallbackChannel<IService1Callback>().Progress(what, (i+1)*0.1M);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {

        using (ServiceHost host = new ServiceHost( typeof(Service1), new Uri[] { new Uri("net.tcp://localhost:6789") }))
        {
            host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(SecurityMode.None), "Service1");
            host.Open();
            Console.ReadLine();
            host.Close();
        }
    }
}

客户

public class CallbackHandler : IService1Callback
{
    public void Progress(string what, decimal percentDone)
    {
        Console.WriteLine("Have done {0:0%} of {1}", percentDone, what);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Setup the client
        var callbacks = new CallbackHandler();
        var endpoint = new EndpointAddress(new Uri("net.tcp://localhost:6789/Service1"));
        using (var factory = new DuplexChannelFactory<IService1>(callbacks, new NetTcpBinding(SecurityMode.None), endpoint))
        {
            var client = factory.CreateChannel();
            client.Process("JOB1");
            Console.ReadLine();
            factory.Close();
        }
    }
}

这使用 net.tcp 上的双工通道,服务器触发通信以通知客户端进度更新。

客户端会显示:

Have done 10% of JOB1
Have done 20% of JOB1
Have done 30% of JOB1
Have done 40% of JOB1
Have done 50% of JOB1
Have done 60% of JOB1
Have done 70% of JOB1
Have done 80% of JOB1
Have done 90% of JOB1
Have done 100% of JOB1

【讨论】:

  • 这很好,但是如果没有典型的 console.writeline,你将如何使用它?而是更新进度条?
  • 在 WinForms 中你可以简单地让你的表单实现 IService1Callback 并在 Progress(...) 的实现中更新你的进度条。
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多