Лучший отвечающий
WCF - Windows служба, создание клиента\хоста для работы на разных машинах

Вопрос
-
В общем изучаю WCF, сделал простейший пример из книги, где я создаю хоста для WCF сервиса используя
adress="http://[IPv6]:8080/MathServiceLibrary" binding = "basicHttpbinding". Параметры serviceProcessInstaller на хосте Account = "LocalSystem". В общем я пытаюсь разобраться как мне дать возможность клиенту обращаться к службе windows на разных машинах. Клиент спокойно обращается к сервису, если оба на локальной машине, а как только перенесу клиент на другую машину все неработает. Честно говоря мне кажется, что я понимаю, что работать надо с значением аккаунта serviceProcessInstaller (так как LocalSystem мне кажется не подходит), но я не разбераюсь, что лучше ставить. Поделитесь опытом, может еще где-то настраивать в винде надо? Использую windows 7.
UPDATE: Local Service, Nework Service не помогли, командой
netsh http add urlacl url=http://+:8080/MathServiceLibrary/ user=**********
права дал, но на другой машине не работает. Когда кстати работал с класом Socket(организовал TCP связь) все работало, значит я так понять это не брандмауэр мне кажется.
П.C.: модеры, извините если не там тему создал- Изменено Khad515 15 сентября 2017 г. 16:22 Попробовал кое что и запости результаты, чтобы пользователи не писали то же самое
15 сентября 2017 г. 15:55
Ответы
-
Конфигурация вроде правильная (если конечно вы не ошиблись в IP-адресе). В исключении пути с другой машины, потому что они прописаны в отладочных символах (PDB-файлах), они служат только для облегчения отладки. Проблема именно сетевая. Попробуйте для проверки отключить брандмауэры и сетевые экраны антивирусов на обоих машинах. Если поможет, то смотрите что где нужно добавить в исключения. Если нет, даже не знаю в чем может быть ошибка.
- Помечено в качестве ответа Khad515 18 сентября 2017 г. 16:06
17 сентября 2017 г. 9:48
Все ответы
-
"неработает"
Как именно (какую ошибку выводит)? Binding с метаданными (добавление Service Reference в проект студии) работает? Покажите конфиги сервера и клиента
16 сентября 2017 г. 14:47 -
1) Это конфиг хоста сервиса
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <services> <service name="MathServiceLibrary.MathService"></service> </services> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Его abc я задаю так:
myhost = new ServiceHost(typeof(MathService), new Uri("http://[IPv6]:8080/MathServiceLibrary")); myhost.AddDefaultEndpoints();
2) Конфиг клиента
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IBasicMath" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://[IPv6]:8080/MathServiceLibrary" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBasicMath" contract="ServiceReference1.IBasicMath" name="BasicHttpBinding_IBasicMath" /> </client> </system.serviceModel> </configuration>
3) Клиент к сервису я подключить могу. То есть я спокойно добавляю ссылку на сервис и клиент обращается к сервису(к службе) все окей, но вот как только я перенесу клиент на другую машину, клиент пытается получить доступ, но проходит некоторое время и он завершается с исключением
System.ServiceModel.EndpointNotFoundException произошло HResult=0x80131501 Сообщение = Прослушивание на http://[IPv6]:8080/MathServiceLibrary не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). Источник = mscorlib Трассировка стека: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) в MathClient.ServiceReference1.IBasicMath.EndAdd(IAsyncResult result) в MathClient.ServiceReference1.BasicMathClient.EndAdd(IAsyncResult result) в F:\C# server data\WCF\MathClient\MathClient\Connected Services\ServiceReference1\Reference.cs:строка 92 в MathClient.Program.<>c__DisplayClass0_0.<Main>b__0(IAsyncResult ar) в F:\C# server data\WCF\MathClient\MathClient\Program.cs:строка 20 в System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) Внутреннее исключение 1: WebException: Невозможно соединиться с удаленным сервером Внутреннее исключение 2: SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера
Путь который указан в исключении, незнаю почему, но это путь с той машины где я писал клиент. То есть мой процесс разработки был такой:
1) Написал проект WCF Service Library
2) Написал проект Windows Service(хост)
3) Написал клиент Console App
То есть все на одном компе, а после я переношу клиент на другую машину(на ноут с win 7). Я честно говоря в этом деле довольно таки плохо плаваю, по этому мне казалось\кажется, что я делаю\делал правильно написал все части на одном компе, а потом переношу на другой комп клиент. Может мне стоило какие то настройки доп. в клиенте сделать? Что-то точно неправильно делаю, а вот что...
- Изменено Khad515 17 сентября 2017 г. 8:50 СкрылIpV6
16 сентября 2017 г. 20:21 -
Попытался сделать 2 вещи. Если доступ к службе есть, значит я могу перейти в браузере по адресу
http://[IPv6]:8080/MathServiceLibrary с другой машины, не находит, то есть не видит такой службы. Соответственно уже зная ответ попробовал на другой машине задать Service Reference не дал никакого результата(не видит службу). Ниже ошибка которая возникла при попытке добавления службы
Произошла ошибка при загрузке '' http://[IPv6]:8080/MathServiceLibrary''. Невозможно соединиться с удаленным сервером Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера [IPv6]:8080 Метаданные содержат неразрешимую ссылку: "http://[IPv6]:8080/MathServiceLibrary". Прослушивание на http://[IPv6]:8080/MathServiceLibrary не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). Невозможно соединиться с удаленным сервером Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера [fe80::59e5:e166:16d0:8e53]:8080 Если служба определена в текущем решении, попробуйте собрать решение и добавить ссылку на службу еще раз.
Собственно вопрос остается тот же, как вообще настраивать данное взаимодействие? Конечно глупо предполагать, что достаточно написать службу и клиент, чтобы можно было обращаться с другой машины. Но я не могу это загуглить..
17 сентября 2017 г. 8:56 -
Конфигурация вроде правильная (если конечно вы не ошиблись в IP-адресе). В исключении пути с другой машины, потому что они прописаны в отладочных символах (PDB-файлах), они служат только для облегчения отладки. Проблема именно сетевая. Попробуйте для проверки отключить брандмауэры и сетевые экраны антивирусов на обоих машинах. Если поможет, то смотрите что где нужно добавить в исключения. Если нет, даже не знаю в чем может быть ошибка.
- Помечено в качестве ответа Khad515 18 сентября 2017 г. 16:06
17 сентября 2017 г. 9:48 -
Да точно, вырубил брандмауэры и все запахало. Хорошо, уже что-то( это же надо топтаться столько на этом). В общем ответ дан, мне теперь осталось понять как правильно настроить правила которые описывают исходящие и входящие подключения в фаерволе, и могу спокойно изучать дальше.18 сентября 2017 г. 16:06
-
Да точно, вырубил брандмауэры и все запахало. Хорошо, уже что-то( это же надо топтаться столько на этом). В общем ответ дан, мне теперь осталось понять как правильно настроить правила которые описывают исходящие и входящие подключения в фаерволе, и могу спокойно изучать дальше.
"Вырубив" брандмауэр Вы оставите систему незащищенной. Откройте в нем порт (как я понял, 8080) для входящих подключений и будет Вам счастье.
Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!
- Предложено в качестве ответа Alexander RusinovModerator 19 сентября 2017 г. 20:18
19 сентября 2017 г. 17:26