Как использовать службу wcf в приложении hostconsole из приложения клиентской консоли - PullRequest
2 голосов
/ 12 февраля 2010

Как использовать службу wcf в приложении hostconsole из приложения консоли клиента. Вот сервис wcf:

namespace HostConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FirstWcfService.Service)))
            {
                host.Open();
                Console.WriteLine("Sai");
                Console.ReadLine();
            }
        }
    }
}

Sky, еще раз спасибо. Вы прочитали мои мысли.

Однако я столкнулся с проблемой:

Вот как я изменил приведенный выше код для хоста и клиента:

Хост

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace ConsoleApplication1
{
    class Program
    {

        private static void Main(string[] args)
        {
            const string endpointAddress = "net.tcp://localhost:8001/Service";

            var baseAddress = new Uri(endpointAddress);

            using (var host = new ServiceHost(typeof(FirstWcfService.Service), baseAddress))
            {
                host.AddServiceEndpoint(typeof(FirstWcfService.IService), new NetTcpBinding(), baseAddress);
                host.Open();

            }

            Console.WriteLine("Sai");
            Console.ReadLine();
        }

    }
}

Клиент

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

namespace ConsoleApplication2
{
    class Program
    {
        private static void Main(string[] args)
        {
            const string endpointAddress = "net.tcp://localhost:8001/Service";


                // this is the client code.. simply put this in another console app
                using (var factory = new ChannelFactory<FirstWcfService.IService>(new NetTcpBinding(), endpointAddress))
                {
                    FirstWcfService.IService channel = factory.CreateChannel();

                    //DateTime d = channel.GetDate();
                    string h = channel.Hello();

                    //Console.WriteLine(String.Format("It is {0}", d));
                    Console.WriteLine(String.Format("It is {0}", h));
                }
                //// end client code

        }


    }
}

Хост работает нормально, когда клиент запускается, вот исключение, которое я получаю:

Не удалось подключиться к net.tcp: // localhost: 8001 / Service. Попытка подключения продолжалась в течение промежутка времени 00: 00: 00.8899011. Код ошибки TCP 10061: не удалось установить соединение, поскольку целевая машина активно отказала ему в этом. 127.0.0.1:8001.

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения. Спасибо N * * тысяча двадцать-один

1 Ответ

1 голос
/ 12 февраля 2010

Самая простая реализация, не зная подробностей ... и есть несколько проблем с обработкой ошибок и устранением неисправностей, но это должно помочь вам ....

Вам необходимо убедиться, что вы внедрили интерфейс для своей службы и убедиться, что привязка и адрес совпадают между службой и клиентом.

Примечание: я использую net.tcp по нескольким причинам. 1) Я знаю, что он соответствует требованиям, которые мотивируют этот вопрос, и 2) он устраняет необходимость иметь дело с большим количеством проблем, принимающих службы http в 2008 / vista / 7. .

using System;
using System.ServiceModel;

namespace ConsoleApplication1
{

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        DateTime GetDate();
    }


    public class ServiceImplementer : IService
    {
        #region IService Members

        public DateTime GetDate()
        {
            return DateTime.Now;
        }

        #endregion
    }



    internal class Program
    {
        private static void Main(string[] args)
        {
            const string endpointAddress = "net.tcp://localhost:8001/Service";

            var baseAddress = new Uri(endpointAddress);

            using (var host = new ServiceHost(typeof (ServiceImplementer), baseAddress))
            {
                host.AddServiceEndpoint(typeof (IService), new NetTcpBinding(), baseAddress);
                host.Open();



                // this is the client code.. simply put this in another console app
                using (var factory = new ChannelFactory<IService>(new NetTcpBinding(), endpointAddress))
                {
                    IService channel = factory.CreateChannel();

                    DateTime d = channel.GetDate();

                    Console.WriteLine(String.Format("It is {0}", d));
                }
                // end client code

            }

            Console.WriteLine("Sai");
            Console.ReadLine();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...