Настройте WCF для прослушивания только LOCALHOST

Подобно ограничению веб-сервера разработки Visual Studio (Cassini), который работает только на локальном хосте, у меня есть реализация службы WCF, которая требуется только на локальном хосте.

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

Является ли binding.HostNameComparisonMode = HostNameComparisonMode.Exact правильным решением? Я не понимаю, как этого достаточно.

====

Как и Кассини, эта реализация Сервиса является заменой чего-то еще, что ДЕЙСТВИТЕЛЬНО требует сетевого взаимодействия. Клиент может быть настроен для подключения к реальному серверу или поддельной реализации, работающей на локальном хосте.


person Jason Kleban    schedule 02.03.2010    source источник


Ответы (2)


Это зависит от того, как вы его размещаете. Если вы используете IIS7 или WAS, WCF использует режим сопоставления IIS. В противном случае, если вы используете HostNameComparisonMode.Exact, то да, имя хоста всегда будет решающим фактором при сопоставлении. Если имя хоста не совпадает, диспетчеризация, как правило, завершается ошибкой.

Следует отметить, что точное не является абсолютно точным на 100%... оно все еще допускает некоторые изменения в имени хоста. Если у вас есть и имя хоста NetBios, и полное имя DNS, сопоставление все равно будет происходить, поскольку WCF рассматривает эти два имени как одно и то же.

System.ServiceModel.BasicHttpBinding.HostNameComparisonmode

person jrista    schedule 02.03.2010
comment
Я снова пробовал привязку.HostNameComparisonMode = HostNameComparisonMode.Exact, и она не работает. После очистки соответствующих правил брандмауэра Windows брандмауэр снова предлагает разрешить это. - person Jason Kleban; 02.03.2010
comment
Я также добавил new Uri("net.tcp://localhost") в качестве базового адреса в конструктор ServiceHost. - person Jason Kleban; 02.03.2010
comment
Что ж, похоже, что брандмауэр будет подсказывать вам независимо от того, является ли он петлевым хостом или нет. Я не уверен, что с этим можно что-то сделать, кроме как использовать Named Pipes. - person jrista; 02.03.2010

Я думаю, что вы подходите к этому неправильно. Вы должны использовать привязку именованного канала, которая должна поддерживать любой шаблон обмена сообщениями, который вы используете (он поддерживает запрос-ответ, а также те же режимы параллелизма и состояния сеанса, которые поддерживает WS).

Из раздела MSDN под названием "Выбор транспорта" (выделено мной) :

Когда использовать именованный конвейер

Именованный канал — это объект в ядре операционной системы Windows, например раздел общей памяти, который процессы могут использовать для связи. Именованный канал имеет имя и может использоваться для односторонней или дуплексной связи между процессами на одном компьютере.

Если требуется обмен данными между различными приложениями WCF на одном компьютере и вы хотите предотвратить обмен данными с другого компьютера, используйте транспорт именованных каналов. Дополнительным ограничением является то, что процессы, запущенные с удаленного рабочего стола Windows, могут быть ограничены одним и тем же сеансом удаленного рабочего стола Windows, если только они не обладают повышенными привилегиями.

Это точно соответствует вашим требованиям и должно быть не более чем изменением конфигурации.

person casperOne    schedule 02.03.2010
comment
Согласованный; localhost - это действительно межпроцессное взаимодействие, и именованные каналы лучше всего подходят для этого. - person Randolpho; 02.03.2010
comment
Извините, я поясню: как и Кассини, эта реализация Сервиса является заменой чего-то еще, что ДЕЙСТВИТЕЛЬНО требует сетевого взаимодействия. Клиент может быть настроен для подключения к реальному серверу или поддельной реализации, работающей на локальном хосте. - person Jason Kleban; 02.03.2010
comment
@Jason: Если клиент можно настроить, почему бы не настроить его для использования конечной точки именованного канала, а не конечной точки Http? Поскольку WCF может и то, и другое, а вызов службы через канал и http одинаков для WCF ... зачем беспокоиться о чем-то еще? - person jrista; 02.03.2010
comment
Привет jrista, В этом конкретном приложении конечные точки не настраиваются таким образом. - person Jason Kleban; 02.03.2010
comment
Почему они не могут быть настроены таким образом? - person jrista; 02.03.2010
comment
@Jason: В любом коде по-прежнему легко заменить используемую привязку (поскольку вы создаете создание привязки WsHttpBinding или BasicHttpBinding где-то), а затем заменить ее на NetNamedPipeBinding (зависимую на коммутаторе). - person casperOne; 02.03.2010
comment
Хорошо, я понимаю, о чем вы говорите, но в данном случае это должно быть сетевое подключение. Это разумная цель, даже если есть другие способы достижения аналогичного эффекта. - person Jason Kleban; 02.03.2010
comment
Этот ответ является хорошим советом, но ответ, отмеченный как правильный, действительно является правильным ответом. Вы можете вызвать свою службу через javascript, и вам нужна веб-привязка или привязка http. В этом случае вы не можете использовать namedpipe, я думаю. - person Farshid Saberi; 13.11.2020