Как скрыть мой сервис WCF - PullRequest
3 голосов
/ 24 ноября 2010

У меня есть служба WCF, встроенная в службу Windows.Он привязан к localhost, но также принимает соединение с такого рода URL - «http://ip:port/ServiceName", как я могу скрыть его от других и разрешить соединение только с localhost.

Вот моя конфигурация службы

<system.serviceModel>
 <behaviors>
  <serviceBehaviors>
     <behavior name="Test.Service.ServiceBehavior">
         <serviceMetadata httpGetEnabled="true" /> 
         <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior>
  </serviceBehaviors>
 </behaviors>
 <services>
   <service behaviorConfiguration="Test.Service.ServiceBehavior" name="Test.Service.TestService">
      <endpoint address="localhost" binding="wsHttpBinding" contract="Test.Service.IService">
        <identity>
           <dns value="localhost" /> 
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      <host>
         <baseAddresses>
              <add baseAddress="http://localhost:8732/MyService/service" /> 
         </baseAddresses>
      </host>
  </service>
</services>
</system.serviceModel>

Ответы [ 3 ]

6 голосов
/ 24 ноября 2010

Чтобы «спрятать» его, вам нужно отключить любой обмен метаданными, поэтому вам нужно удалить:

<serviceMetadata httpGetEnabled="true" /> 

из вашего служебного поведения, и вам нужно удалить конечную точку mex:

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 

Однако, это только «затеняет» это. Чтобы не вызывать кого-либо, кроме localhost, - почему бы не переключиться на netNamedPipeBinding, который по замыслу «только на этой машине», - никакие внешние абоненты не могут звонить в эту конечную точку.

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

1 голос
/ 24 ноября 2010

Я бы переключился на NetNamedPipeBinding - это присуще только локально, но также позволяет избежать нескольких дополнительных слоев и не требует доступа к каким-либо портам (которых не имеют администраторы по умолчанию). Это можно сделать в конфигурации, используя элемент <netNamedPipeBinding>.

0 голосов
/ 24 ноября 2010

Если вы пользуетесь хостингом в IIS, вы можете просто изменить привязки сайта с "*" на "127.0.0.1"

...