powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
8 сообщений из 8, страница 1 из 1
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204232
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток,

Windows 7x64 SP1. Visual Studio 2015 Update 1.

Написал пару простых проектов в составе одного и того же решения: некоторый WCF серфис (self-hosted) и клиент под него. Оба проекта являются консольными приложениями. Для взаимодействия клиента со службой я использую протокол HTTP. Когда служба и клиент находятся на одной машинке, тогда всё работает без проблем. Однако если я перемещаю клиента на другой компьютер, то на стороне клиента получаю такое сообщение об ошибке:

Client ApplicationThe communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.
Конфигурационный файл хоста моей службы выглядит так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <system.serviceModel>
    <services>
      <service name="Bushman.DWGService.Database" behaviorConfiguration="MEXGET">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8002/Database/"/>
          </baseAddresses>
        </host>
        <endpoint 
          name="HTTP_Endpoint" binding="wsHttpBinding" 
          bindingConfiguration="HTTP"
          contract="Bushman.DWGService.IDatabase"/>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="HTTP"/>
      </wsHttpBinding>
    </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior name="MEXGET">
        <serviceMetadata httpGetEnabled="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  </system.serviceModel>
</configuration>


Хост службы находится на компьютере win7x64ac2 . Конфигурационный файл клиента, находящегося на другом компьютере такой:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="HTTP_Endpoint" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://win7x64ac2:8002/Database/" binding="wsHttpBinding"
                bindingConfiguration="HTTP_Endpoint" contract="ABCDF.IDatabase"
                name="HTTP_Endpoint">
                <identity>
                    <userPrincipalName value="hyprostroy\developer" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>


С клиентской машинки компьютер win7x64ac2 пингуется успешно.

Почему, когда клиент находится на др. компьютере - я получаю обозначенную выше ошибку? Может чего-то не хватает в конфигурационных файлах?

С уважением, Андрей
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204239
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum, отлавливать и хэндлить ошибки на серверной стороне - это во-первых. Во вторых проверять состояние канала.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
if(client.InnerChannel.State != System.ServiceModel.CommunicationState.Faulted)
{
   // call service - everything's fine
}
else
{
   // channel faulted - re-create your client and then try again
}
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204370
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

На стороне клиента у меня такой код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
static void Main(string[] args) {
    Console.Title = "Client";
    int n = 1;
    int max = 5;
    while (n <= max) {
        try {
            using (DatabaseClient db = new DatabaseClient("HTTP_Endpoint")) {
                Console.WriteLine("CommunicationState: {0}\n", db.InnerChannel.State);
                if (db.InnerChannel.State != System.ServiceModel.CommunicationState.Faulted) {
                    db.SaveAs("AAA", "BBB", 0, 0, 0);
                    Console.WriteLine("AppName: {0}\n", db.GetAppName());
                    n = max;
                }
            }
        }
        catch (Exception ex) {
            ConsoleColor color = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(ex.Message);
            Console.ForegroundColor = color;
        }
        finally {
            ++n;
            Console.WriteLine("Attemption #{0}\n", n);
        }
    }
    Console.WriteLine("Press any key for exit...");
    Console.ReadKey();
}


В консоль выводится, что "CommunicationState: Created", но далее, при попытке вызова методов прокси получаю исключение с сообщением, обозначенным мною ранее. Все пять попыток, выполняемые в цикле - безуспешны. telnet показывает, что порт удалённой машины доступен.
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204377
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum, ну так что Created означает? Его поди опен надо?
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204391
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserCompositum, ну так что Created означает? Его поди опен надо?
Хм... В книге Джувел Лёве "Создание служб WCF" автор на стр. 56 демонстрирует использование proxy и явным образом не вызывает db.Open(); Я пробовал вызывать этот метод до вызова интересующих меня методов моего прокси (в частности перед вызовом db.SaveAs(...);), но результат не изменился. Кроме того, ведь когда служба и сервис на одной машине, то работало и без db.Open(); .
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204440
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В стеке событий вижу кучу исключений, которые появляются при вызове db.Open() или при вызова db.SaveAs(...) (если закомментировать db.Open() ). Первое исключение пишет так:

Exception thrown: 'System.ComponentModel.Win32Exception' in System.ServiceModel.dll ("The Security Support Provider Interface (SSPI) negotiation failed.") System.ComponentModel.Win32Exception
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204450
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum, а можете объяснить почему contract и address сервиса разные у сервера и клиента?
...
Рейтинг: 0 / 0
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
    #39204614
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronCompositum, а можете объяснить почему contract и address сервиса разные у сервера и клиента?
Могу конечно.

Адрес разный потому, что клиент и сервис находятся на разных машинах. В виду этого сервис свою машину обозначает как localhost, а клиенту эту машину нужно указывать либо по имени, либо по IP. Одинаковыми они будут лишь в том случае, когда и серсис и клиент находятся на одной и той же машине.

Контракт у клиента указывает на интерфейс proxy, который генерируется автоматом средствами IDE. Какое имя пространству там назначаем - то и используется. Назначать это имя можно произвольно - роли не играет.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]