Первая попытка WCF: как заставить работать BasicHttpBinding (клиент и сервер на одной машине) - PullRequest
0 голосов
/ 19 декабря 2018

Невозможно установить сокетное соединение, поскольку целевая машина активно отказывала в этом.

Я реализовал стандартный код из учебника (опубликован в 2008 г.) для службы WCF и клиента.Оба работают на одной машине под Windows 10 с обычными учетными записями пользователей (без прав администратора).

Я изучил информацию в книге, чтобы найти решение этой проблемы, но я не понимаю, о чем они говорят.

Служба

using (var host = new ServiceHost(typeof(Service1), new Uri("http://localhost:8123/Service1")))
{
    host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "Service1Http");
    host.Open();
}

Это работаетс правами администратора (не очень хорошо, но нормально с первой попытки).

Клиент

var ep = new EndpointAddress("http://localhost:8123/Service1/Service1Http");

var proxy = ChannelFactory<IService1>.CreateChannel(new BasicHttpBinding(), ep);

string s = proxy.SayHello();

В последней строке выдается исключение, которое говорит о том, что соединение "активно отклонено".

Может кто-нибудь пролить свет на это?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:13020");
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.None;
            using (ServiceHost sh=new ServiceHost(typeof(MyService),uri))
            {
                sh.AddServiceEndpoint(typeof(IService), binding, "");
                ServiceMetadataBehavior smb;
                smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb==null)
                {
                    smb = new ServiceMetadataBehavior()
                    {
                        HttpGetEnabled = true
                    };
                    sh.Description.Behaviors.Add(smb);
                }
                Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
                sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
                sh.Opened += delegate
                {
                    Console.WriteLine("service is ready...");
                };
                sh.Closed += delegate
                {
                    Console.WriteLine("Service is closed now...");
                };
                sh.Open();

                Console.ReadLine();
                sh.Close();
            }
        }  
}

Остается один вопрос: как заставить сервер работать без прав администратора?

Вы можете дать своей учетной записи приложения необходимые разрешения.Для этого мы зарезервировали пространство имен URL для учетной записи, позволяя соответствующему приложению зарегистрировать этот URL.Мы можем использовать команду Netsh (для этого инструмента требуются права администратора).

Netsh http add urlacl url=http://+:8080/ user=domain\user

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

Netsh http add urlacl url=http://+:8123/ user=administrator

« + » - это подстановочный знак, указывающий, что все запросы сетевых адаптеров могут получить доступ к этому URL.
Вот официальный документ об этом инструменте.
https://docs.microsoft.com/en-us/windows/desktop/Http/netsh-commands-for-http
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

0 голосов
/ 19 декабря 2018

Это может быть связано с неправильной настройкой прокси между сервером и клиентом.Я думаю это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...