Еще один вопрос по WCF
От: SanyaVB  
Дата: 04.02.15 15:13
Оценка:
Есть роутер — у него есть реальный IP (допустим 213.180.193.11 ), но нет доменного имени.
Есть компьютер подключенный к этому роутеру и допустим у него имя Computer и ip 192.168.0.199
Допустим у роутера прокинут порт 80 на компьютер Computer.

Как я должен настроить службу, которая запускается из консольного приложения, чтобы можно до неё достучаться например из интернета скажем так схематично по адресу http://213.180.193.11:80 ???

Набросок кода такой:
Служба
using (ServiceHost managerHost = new ServiceHost(typeof(Manager), new Uri("http://192.168.0.199:80")))
{
   managerHost.AddServiceEndpoint(typeof(IManagerContract), GetHttpBinding(), string.Empty);
   while (Console.ReadKey(true).Key != ConsoleKey.Escape) ;
}

//................

private static WSDualHttpBinding GetHttpBinding()
{
     WSDualHttpBinding binding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
     binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
     return binding;
}


Клиент
     Client client = new Client(new InstanceContext(new Test()), GetHttpBinding(), new EndpointAddress(new Uri("http://213.180.193.11:80")));
     client.Test();

//................

    class Client : DuplexClientBase<IManagerContract>, IManagerContract
    {
        public Client(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress) 
            : base(callbackInstance, binding, remoteAddress) { }

        public void Test()
        {
            return base.Channel.Test();
        }      
    }

private static WSDualHttpBinding GetHttpBinding()
{
     WSDualHttpBinding binding = new WSDualHttpBinding(WSDualHttpSecurityMode.None);
     binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
     return binding;
}

такой код не прокатывает. Клиент сразу же ругется кодом 417 Он видимо очень хочет чтобы за место http://213.180.193.11:80 было http://Computer:80 Но доменного имени у реального IP нет. Как тут быть, если не прибегать к файлу C:\Windows\System32\drivers\etc\hosts?
Почему WCF предпочитает в URI имя компьютера нежели его IP? И как его заставить понимать IP если это возможно?

Помогите пожалуйста, хочу разобраться с этим начальным этапом проектирования серверной-клиентской части!
Re: Еще один вопрос по WCF
От: Klikujiskaaan КНДР  
Дата: 04.02.15 15:28
Оценка:
Здравствуйте, SanyaVB, Вы писали:

Настроить роутер так, что бы на запрос по восьмедисятому порту он редиректил на нужный айпишник
Re[2]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 04.02.15 15:32
Оценка:
Здравствуйте, Klikujiskaaan, Вы писали:

K>Здравствуйте, SanyaVB, Вы писали:


K>Настроить роутер так, что бы на запрос по восьмедисятому порту он редиректил на нужный айпишник

Это все уже было сделано (забыл написать)
Re: Еще один вопрос по WCF
От: Слава  
Дата: 04.02.15 17:51
Оценка:
Здравствуйте, SanyaVB, Вы писали:

Я бы указывал адрес 0.0.0.0:80, чтобы WCF слушал на всех интерфейсах.
Re: Еще один вопрос по WCF
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 05.02.15 04:54
Оценка: +1
Здравствуйте, SanyaVB, Вы писали:

SVB>Почему WCF предпочитает в URI имя компьютера нежели его IP? И как его заставить понимать IP если это возможно?

WCF прекрасно работает с IP адресами (по крайней мере с IPv4 — для IPv6 мне просто не довелось попробовать).
Проблема в чем-то другом.

Я все же настоятельно прошу приводить полный текст ошибки, которую вы получаете. Искать описание по коду нет никакого желания
Re[2]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 05.02.15 07:50
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, SanyaVB, Вы писали:


SVB>>Почему WCF предпочитает в URI имя компьютера нежели его IP? И как его заставить понимать IP если это возможно?

МР>WCF прекрасно работает с IP адресами (по крайней мере с IPv4 — для IPv6 мне просто не довелось попробовать).
МР>Проблема в чем-то другом.

МР>Я все же настоятельно прошу приводить полный текст ошибки, которую вы получаете. Искать описание по коду нет никакого желания


Михаил, ошибка такая на клиенте(причем без задержек моментально происходит): Удаленный сервер вернул неожиданный ответ: (417) Expectation Faild.
Удаленный сервер возвратил ошибку: (417) Expectation Faild.
на сервере в логах нет ни одного упоминания что была попытка подключения.
КСТАТИ ЕСЛИ СЕРВЕР НЕ ВКЛЮЧАТЬ, ТО КЛИЕНТ ПО ПРЕЖНЕМУ ВОЗВРАЩАЕТ ТАКУЮ ЖЕ ОШИБКУ!!! клиент выходит через прокси.

поднял IIS на серверной машине. клиенская машина на сайт по умолчанию заходит через браузер. т.е. связь есть

исходный код я привел выше. там только адреса выдуманные
Re[3]: Еще один вопрос по WCF
От: pugv Россия  
Дата: 05.02.15 09:55
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB> клиент выходит через прокси.


Заголовок "Expect: 100-Continue" в запросе имеется? Если да, убрать можно так:

<system.net>
   <settings>
      <servicePointManager expect100Continue="false" />
   </settings>
</system.net>
http://www.brainbench.com/images/certlogo/color/mastercert/cppprogrammer.gif http://www.brainbench.com/images/certlogo/color/mastercert/netframework40.gif
Re[4]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 09:46
Оценка:
Здравствуйте, pugv, Вы писали:

P>Здравствуйте, SanyaVB, Вы писали:


SVB>> клиент выходит через прокси.


P>Заголовок "Expect: 100-Continue" в запросе имеется? Если да, убрать можно так:


P>
P><system.net>
P>   <settings>
P>      <servicePointManager expect100Continue="false" />
P>   </settings>
P></system.net>
P>


Не помогло
Ошибка (приведу ниже) возникает без задержек одна и та же при включенной службе и при выключенной:
Получен неправильный HTTP
Удаленный сервер вернул неожиданный ответ: (405) Method Not Allowed.
Удаленный сервер вернул возвратил ошибку: (405) Недопустимый метод.

Мысли вслух, возможно абсолютно не верные: если не ошибаюсь, в заголовок HTTP можно указывать не обязательную информацию о хосте, а именно имя хоста. делается это для того чтобы можно к одному IP привязать множество доменных имен. Для точного определения до какой именно службы нужно стучаться в этот заголовок клиент пишет имя хоста. Может быть WCF по умолчанию такую штуку делает?
Re[2]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 09:53
Оценка:
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, SanyaVB, Вы писали:


С>Я бы указывал адрес 0.0.0.0:80, чтобы WCF слушал на всех интерфейсах.


netstat -a показывает что WCF сидит на 0.0.0.0:80, не зависимо IP или имя компьютера указываю в URI
Re[5]: Еще один вопрос по WCF
От: pugv Россия  
Дата: 06.02.15 09:53
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Ошибка (приведу ниже) возникает без задержек одна и та же при включенной службе и при выключенной


Правильно, потому что до вашей службы запрос и не доходит, её прокси возвращает.

SVB> (405) Method Not Allowed.


Смотрите фиддлером, все увидите — кто вам возвращает 405, какой метод в вашем запросе, какие методы допустимы (стандарт обязывает в ответе 405 возвращать список Allowed).
http://www.brainbench.com/images/certlogo/color/mastercert/cppprogrammer.gif http://www.brainbench.com/images/certlogo/color/mastercert/netframework40.gif
Re[6]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 10:01
Оценка:
Здравствуйте, pugv, Вы писали:

P>Здравствуйте, SanyaVB, Вы писали:


SVB>>Ошибка (приведу ниже) возникает без задержек одна и та же при включенной службе и при выключенной


P>Правильно, потому что до вашей службы запрос и не доходит, её прокси возвращает.


SVB>> (405) Method Not Allowed.


P>Смотрите фиддлером, все увидите — кто вам возвращает 405, какой метод в вашем запросе, какие методы допустимы (стандарт обязывает в ответе 405 возвращать список Allowed).


Т.е. мне надо поставить прокси (фидлер) и настроить его на прокси фирмы, раз мы через неё выходим в интернет. Верно я понял?
Re[7]: Еще один вопрос по WCF
От: pugv Россия  
Дата: 06.02.15 10:29
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Т.е. мне надо поставить прокси (фидлер) и настроить его на прокси фирмы, раз мы через неё выходим в интернет. Верно я понял?


Ну да, поставьте на клиенте фиддлер и проанализируйте соответствующие запросы и ответы.
http://www.brainbench.com/images/certlogo/color/mastercert/cppprogrammer.gif http://www.brainbench.com/images/certlogo/color/mastercert/netframework40.gif
Re[6]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 10:39
Оценка:
Здравствуйте, pugv, Вы писали:
P>Смотрите фиддлером, все увидите — кто вам возвращает 405, какой метод в вашем запросе, какие методы допустимы (стандарт обязывает в ответе 405 возвращать список Allowed).

Ура! Дебагер помог (проблема была в 100-Continue). я смог достучаться до сервера. если захожу через браузер мне возращается страница WCF — по умолчанию. Но через клиент я не могу связаться и по тайматуту клиент завершает работу. Однако в логах сервера я вижу как клиент до него стучится 5 раз! Но серверу его стуки не нравятся и вот что он пишет:

There was no endpoint listening at http://sanyavb/Temporary_Listen_Addresses/a22db036-5546-4b9e-aab6-f87957950e69/5100491e-a437-4bad-9dbc-11791eaf4be4 that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.


Что надо сделать чтобы сервер принял клиента за своего?
Re[7]: Еще один вопрос по WCF
От: pugv Россия  
Дата: 06.02.15 10:47
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>There was no endpoint listening at http://sanyavb/Temporary_Listen_Addresses/a22db036-5546-4b9e-aab6-f87957950e69/5100491e-a437-4bad-9dbc-11791eaf4be4 that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.


Ну... Для начала посмотрите InnerException, если есть возможность сервер под отладчиком запустить.
А так, опять же анализируйте трафик, браузер очевидно шлёт обычный GET-запрос, а вот клиент...
Смотрите конфиги сервера (эндпойнты и байндинги).
http://www.brainbench.com/images/certlogo/color/mastercert/cppprogrammer.gif http://www.brainbench.com/images/certlogo/color/mastercert/netframework40.gif
Re[8]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 12:32
Оценка:
Здравствуйте, pugv, Вы писали:

P>Ну... Для начала посмотрите InnerException, если есть возможность сервер под отладчиком запустить.

P>А так, опять же анализируйте трафик, браузер очевидно шлёт обычный GET-запрос, а вот клиент...
P>Смотрите конфиги сервера (эндпойнты и байндинги).

1) InnerException нет.
2) лог сервера идентичен вот такому
Автор: SanyaVB
Дата: 06.02.15
отличие только в том, что я там пытаюсь к локальной машине присоединиться, а тут через интернет.
Re[8]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 12:58
Оценка:
Здравствуйте, pugv, Вы писали:

P>Смотрите конфиги сервера (эндпойнты и байндинги).

Конфиги сервера (эндпойнты и байндинги) их нет. все жестко в коде
Автор: SanyaVB
Дата: 04.02.15
Re[8]: Еще один вопрос по WCF
От: SanyaVB  
Дата: 06.02.15 13:27
Оценка: :)
Здравствуйте, pugv, Вы писали:

P>Ну... Для начала посмотрите InnerException, если есть возможность сервер под отладчиком запустить.

P>А так, опять же анализируйте трафик, браузер очевидно шлёт обычный GET-запрос, а вот клиент...
P>Смотрите конфиги сервера (эндпойнты и байндинги).


Кстати тупо убрал дуплекс. т.е. за место WSDualHttpBinding взял WSHttpBinding и заработало!
Видимо дуплекс (напишу примитивным языком) получается таким способом. Клиент автоматически создает эндпоинт и отправляет его серверу, а именно как я понимаю вот такой http://sanyavb/Temporary_Listen_Addresses/a22db036-5546-4b9e-aab6-f87957950e69/5100491e-a437-4bad-9dbc-11791eaf4be4
А сервер не может подключиться к клиенту по этому эндпоинту, т.к. машина клиента не видна со стороны сервера. в итоге возникает исключение.

Если две машины друг друга видят, то WSDualHttpBinding работает нормально — проверял!

Верны ли мои рассуждения?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.