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

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
30.03.2016, 15:18
    #39204239
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
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
30.03.2016, 17:20
    #39204370
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
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
30.03.2016, 17:25
    #39204377
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
Compositum, ну так что Created означает? Его поди опен надо?
...
Рейтинг: 0 / 0
30.03.2016, 17:34
    #39204391
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
buserCompositum, ну так что Created означает? Его поди опен надо?
Хм... В книге Джувел Лёве "Создание служб WCF" автор на стр. 56 демонстрирует использование proxy и явным образом не вызывает db.Open(); Я пробовал вызывать этот метод до вызова интересующих меня методов моего прокси (в частности перед вызовом db.SaveAs(...);), но результат не изменился. Кроме того, ведь когда служба и сервис на одной машине, то работало и без db.Open(); .
...
Рейтинг: 0 / 0
30.03.2016, 18:20
    #39204440
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
В стеке событий вижу кучу исключений, которые появляются при вызове 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
30.03.2016, 18:29
    #39204450
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
Compositum, а можете объяснить почему contract и address сервиса разные у сервера и клиента?
...
Рейтинг: 0 / 0
30.03.2016, 22:24
    #39204614
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему клиент не находит службу, когда она на др. машине (связь по HTTP)
AxeleronCompositum, а можете объяснить почему contract и address сервиса разные у сервера и клиента?
Могу конечно.

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

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


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