我写了一个程序,它有两个控制台应用程序(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);
}
}
}