1

我写了一个程序,它有两个控制台应用程序(assusme A & B)和一个 WCF 服务库。我将 A 和 B 连接在一起,因此消息可以从 A 传输到 B 或 B 到 A(WCF 双工)。为此,我将 WCF 服务库的引用添加到 A 和 B 项目中。现在我想将这些控制台应用程序更改为 WinForm 应用程序,但我不能这样做,因为在控制台应用程序中我们有 console.writeline() 它可以在 WCF 服务库中使用但在 WinForm 中,MessageBox 不能在 WCF 服务中使用。

我也无法将 A 和 B 的引用添加到 Wcf 服务,因为它会导致循环依赖错误

编辑:

这是带有控制台应用程序的项目:

在项目 A Program.cs 文件中:

   internal static void StartService()
  {
     myServiceHost = new ServiceHost(typeof(WCF.MessageService));

     myServiceHost.Open();
  }

  internal static void StopService()
  {
     if (myServiceHost.State != CommunicationState.Closed)
        myServiceHost.Close();
  }

  static void Main()
  {
     StartService();
     Console.WriteLine("Service running; press return to exit");
     Console.ReadLine();
     StopService();
     Console.WriteLine("stopped");
  }

在项目 B Program.cs 文件中:

   class ClientCallback : IMyMessageCallback
{
  public void OnCallback(string message)
  {
     Console.WriteLine("message from the server: {0}", message);
  }
}

class Program
{
  static void Main()
  {
     Console.WriteLine("Client - wait for service");
     Console.ReadLine();

     WSDualHttpBinding binding = new WSDualHttpBinding();
     EndpointAddress address =
           newEndpointAddress("http://localhost:8731/Design_Time_Addresses/MessageService/Service1/");

     ClientCallback clientCallback = new ClientCallback();
      InstanceContext context = new InstanceContext(clientCallback);

     DuplexChannelFactory<IMyMessage> factory =
        new DuplexChannelFactory<IMyMessage>(context, binding, address);

     IMyMessage messageChannel = factory.CreateChannel();

     messageChannel.MessageToServer("From the client");

     Console.WriteLine("Client - press return to exit");
     Console.ReadLine();

  }

}

在 IMYMessage.cs 文件(WCF 服务库)中:

   public interface IMyMessageCallback
{
  [OperationContract(IsOneWay = true)]
  void OnCallback(string message);
}

[ServiceContract(CallbackContract = typeof(IMyMessageCallback))]
public interface IMyMessage
{
  [OperationContract]
  void MessageToServer(string message);
}

在 MessageService.cs 文件(WCF 服务库)中:

 public class MessageService : IMyMessage
{
  public void MessageToServer(string message)
  {
     Console.WriteLine("message from the client: {0}", message);
     IMyMessageCallback callback =
           OperationContext.Current.
                 GetCallbackChannel<IMyMessageCallback>();

     callback.OnCallback("message from the server");

     new Thread(ThreadCallback).Start(callback);
   }

   private void ThreadCallback(object callback)
   {
     IMyMessageCallback messageCallback = callback as IMyMessageCallback;
     for (int i = 0; i < 10; i++)
     {
        messageCallback.OnCallback("message " + i.ToString());
        Thread.Sleep(1000);
     }
  }
}
4

1 回答 1

1

我有点惊讶你能够让它与控制台应用程序一起工作,我希望你也能在那里获得循环依赖。

我认为你应该重组你的解决方案,这样A & B 就不会互相引用。您正在使用 WCF 进行通信,因此不需要以任何方式引用它们。

此外,WCF 库不应执行任何 UI 类型的行为,例如控制台写入行或消息框的东西,只返回一个字符串或对象并让您的 UI 应用程序(例如您的控制台应用程序或表单应用程序)处理用户交互/显示

        ------------ ------------
        | | | |
        | 一个 | | 乙|
        |(控制台)| | (表格) |
        | | | |
        ------------ 双工 ------------
        | 通讯 |<==========>| 通讯 |
        | (WCF) | | (WCF) |
        ------------ ------------

于 2012-10-01T21:43:47.693 回答