【问题标题】:console application host wcf service interaction控制台应用宿主wcf服务交互
【发布时间】:2013-01-12 01:19:57
【问题描述】:

由控制台应用程序托管的 WCF 服务可以与所述控制台应用程序交互以执行 Console.WriteLine() IE 的最简单方式是什么。

一些代码:

合同:

[ServiceContract(Name = "IProdsService")]
public interface IProdsService
{
    [OperationContract(Name = "Alert",IsOneWay=true)]
    void Alert(string msg);
}

服务:

public class ProdsService : IProdsService
{
    //IProdsService.Alert implementation
    public void Alert(string msg)
    {
        //TODO: Send Alert to Console Application!
    }
}

控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        ServiceHost prodService = new ServiceHost(typeof(ProdsService));
        ServiceDescription serviceDesciption = prodService.Description;
        prodService.Open();
        Console.ReadLine();
    }
}

【问题讨论】:

  • Console.WriteLine 怎么样?
  • 好的 nvmd,正在进行的事情让我错了,你是对的,只是 Console.WriteLine 做到了......对不起时间

标签: c# .net wcf console-application servicehost


【解决方案1】:

以下是运行主机和客户端的示例,主机可以在控制台上记录消息。在你的例子中,我不确定你为什么设置IsOneWay=true。对于这种特定情况,一种方法不是您想要的。另外,我在以下示例中使用了 net.tcp 绑定;它也应该适用于任何其他绑定。

基本上在示例中,用户的条目被发送到主机服务,主机服务在控制台上回显消息。

[ServiceContract]
public interface IProdsService
{
    [OperationContract]
    void Alert(string msg);
}

/// <summary>
/// Host Class
/// </summary>
public class ProdsService : IProdsService
{
    public ProdsService()
    {
        Console.WriteLine("Service instantiated.");
    }

    public void Alert(string msg)
    {
        Console.WriteLine(msg);
    }
}

/// <summary>
/// Client proxy wrapper
/// </summary>
public class ProdsServiceClient : ClientBase<IProdsService>, IProdsService
{
    public ProdsServiceClient()
    {
    }

    public ProdsServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
        base(binding, remoteAddress)
    {
    }

    public void Alert(string msg)
    {
        base.Channel.Alert(msg);
    }
}

class Program
{
    static ManualResetEvent _reset;

    static void Main(string[] args)
    {
        string host = "localhost";
        int port = 8888;

        //ManualResetEvent is used for syncing start/stop of service.
        _reset = new ManualResetEvent(false);

        var action = new Action<string, int>(Start);
        var result = action.BeginInvoke(host, port, null, null);

        //Wait for svc startup, this can be synced with resetEvents.
        Thread.Sleep(2000);

        //Create a client instance and send your messages to host
        using (var client = new ProdsServiceClient(new NetTcpBinding(), new EndpointAddress(string.Format("net.tcp://{0}:{1}", host, port))))
        {
         client.Alert("Test message");

         string msg = string.Empty;
         do
         {
            Console.Write("Type a message to send (X to exit): ");
            msg = Console.ReadLine();
            client.Alert(msg);
         }
         while (!msg.Trim().ToUpper().Equals("X"));
        }

        //Signal host to stop
        _reset.Set();
        action.EndInvoke(result);

        Console.Write("Press any to exit.");
        Console.ReadKey();
    }

    static void Start(string host, int port)
    {
        string uri = string.Format("net.tcp://{0}:{1}", host, port);
        //var server = new ProdsService();
        ServiceHost prodService = new ServiceHost(typeof(ProdsService));
        prodService.AddServiceEndpoint(typeof(IProdsService), new NetTcpBinding(), uri);
        Console.WriteLine("Service host opened");
        prodService.Open();

        //Wait until signaled to stop
        _reset.WaitOne();
        Console.WriteLine("Stopping host, please wait...");
        prodService.Close();
        Console.WriteLine("Service host closed");
    }
}

【讨论】:

  • OP 说在Alert 操作中执行Console.WriteLine 不起作用。也许它只适用于您的情况,因为您在同一进程中拥有客户端和服务。
  • 好吧,我很愚蠢,我遇到了一个错误,但因为一种方式而没有看到它。 @JohnSaunders 就像你之前说的,我试过了,只需在 Alert 操作中执行 Console.WriteLine 就可以了……对不起,浪费了你们的时间。
【解决方案2】:

duh,我的错,只是从警报操作中调用 console.writeline 就可以了,我被 oneway 愚弄并且没有收到错误...所以这对我来说不再是 oneway...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多