1

2つのコンソールアプリケーション(assusme A&B)とWCFサービスライブラリを含むプログラムを作成しました。AとBを接続して、メッセージをAからBまたはBからA(WCFデュプレックス)に転送できるようにしました。これを行うために、AプロジェクトとBプロジェクトの両方にWCFサービスライブラリの参照を追加しました。これらのコンソールアプリケーションをWinFormアプリケーションに変更したいのですが、コンソールアプリケーションにはWCFサービスライブラリで使用できるconsole.writeline()がありますが、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 に答える