2013-05-31 3 views
6

Очень новый для Self Host WebApi, но я очень впечатлен его простотой использования и расширяемости. По крайней мере, через это tutorial. Все, что я делал до сих пор, работает на моей машине разработки, независимо от того, использую ли я localhost, 127.0.0.1 или мой LAN Ip (192.168.0.x), но я сбив с толку, почему я не могу получить доступ к сервису с любого другого компьютера, даже другие в той же подсети.Self Hosted WebApi, доступный по локальной сети

Короче после прохождения урока на машине, на которой он работает: Просмотр в

localhost:3636/api/products/ 

приводит к ожидаемому XML возврата На другой машине на просмотр LAN к:

192.168.0.x:3636/api/products/ 

приводит к таймауту Точки данных для тех, кто может знать, как все это взаимодействует:

1.) Моя машина dev (192.168.0.x, сервер, хост, что вы хотите назвать) имеет IIS; Я был так параноидален это было в том, что я ее остановил с помощью администрирования GUI

2.) Я зарезервировал URL/порт со следующими казнями командной строки:

>netsh http add urlacl url=http://+:3636/ user=DOMAIN\USER listen=yes delegate=yes 
    >netsh http add urlacl url=http://192.168.0.x:3636/ user=DOMAIN\USER listen=yes delegate=yes 

2б) Я «уже пробовал оба эти вместе и по отдельности, и попытался изменить пользователь„все“без толка

3.) Я попытался изменить код в учебнике, чтобы установить

config.HostNameComparisonMode = HostNameComparisonMode.Exact //default is Strong Wildcard 

- .) Я могу успешно выполнить ping и tracert до 192.168.0.x с других компьютеров в локальной сети.

5.) Друг рекомендовал настроить TCPListener и обеспечить, чтобы я мог использовать telnet для устранения брандмауэра как возможности. Если эта логика звучит, брандмауэр не является проблемой

EDIT: Спасибо за вашу помощь, вот еще одна точка данных, которая, я считаю, подтверждает, что это не проблема с брандмауэром. Я ранее размещал это соединение, когда за довольно тупым (по крайней мере, с не сертифицированным парнем, как я) Juniper Firewall/Router. С тех пор я переделал учебник на другой машине (без IIS) в своей домашней сети и до сих пор не могу опубликовать эту услугу на других компьютерах в моей локальной сети. Есть идеи?

+0

Вы используете службу под DOMAIN \ USER? Обычно я обнаружил, что проще запустить службу как NETWORK SERVICE, а затем в команде netsh, которую вы положили user = «NT AUTHORITY \ NETWORK SERVICE» –

+0

Кроме того, я бы дважды проверил ваш брандмауэр и удостоверился, что netstat -a показывает ваше служение. –

+0

Спасибо Даррел за идеи. В настоящее время я все еще выполняю службу в отладке под своим пользователем (у кого есть права администратора, если это имеет значение). Я запустил netstat -a (на моем dev/хостинге, если это то, что вы имели в виду), и посмотрите следующие записи (среди прочих): Прото локальный адрес Состояние внешнего адреса TCP 0.0.0.0:3636 ДОМЕН: 0 ПРОСЛУШИВАНИЕ TCP [ ::]: 3636 ДОМЕН: 0 ПРОСЛУШИВАНИЕ Не совсем уверен, что с этим делать. Думаю, я постараюсь подтвердить брандмауэр. – David

ответ

2

Ну, это был не аппаратный брандмауэр, Это был брандмауэр Windows! yikes я потратил кучу времени на это. Как только я выключил брандмауэр Windows (в любом случае код работает в интранете) все сработало.

Кто-нибудь знает хороший сайт, который объясняет, как взаимодействуют брандмауэры и проводники; или я полагаю, что это просто первый тест.

+1

Эй, Дэвид, как ты решил эту проблему? –

+3

это не ответ – Amit

0

Я хотел бы попробовать пару вещей:

Во-первых, избавиться от HostNameComparisonMode линии. Это может фактически отключить запросы, поступающие с других компьютеров.

Если все еще не работает, попробуйте избавиться от списков ACL URL и запустите приложение в качестве администратора и посмотрите, работает ли это. Если это сработает, вы можете снова добавить ACL URL-адреса и не запускаться в качестве администратора. Вам нужно только одно с «+» в качестве имени хоста.

+0

Из моего опыта, если IIS работает на том же компьютере, вам потребуется HostNameComparisonMode.Exact или IIS украдут запросы. Хм, подождите, может быть, не на порте, кроме 80. –

+0

Прошу прощения. Я забыл упомянуть каждый раз, когда пытаюсь изменить HostNameComparisonMode. Я получил исключение на сервере .OpenAsync(). Wait(); линия. Точное исключение является вложенным (несколько уровней внутреннего) как: System.AggregateException/System.ServiceModel.CommunicationException/.Net.HttpListenerException: «Формат указанного имени сети недействителен». Вот почему я думал, что это не сработает – David

+0

Я получил его, чтобы скомпилировать и запустить изменение моего параметра конфигурации конфигурации с 196.168.0.x на localhost; однако тогда служба не работала на локальной машине, так что это не так. – David

0

Я столкнулся с той же проблемой, когда пытался использовать хост с использованием OWIN. То, что сработало для меня было -

  1. Run Visual Studio в качестве администратора
  2. Удалите все и все NETSH регистрацию urlacl портов, которые я добавил при отладке этого вопроса
  3. Добавить въездное правило моих окон брандмауэра I следовали инструкциям по этой ссылке https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/firewall-instructions Заканчивать раздел - Чтобы включить диапазон портов заранее

Вот и все! Я смог вызвать свой api с других компьютеров в сети.

Надеюсь, это поможет ...

Смежные вопросы