我在Windows服务中嵌入了WCF服务。它绑定到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>
答案 0 :(得分:6)
要“隐藏”它,您需要关闭任何元数据交换,因此您需要删除:
<serviceMetadata httpGetEnabled="true" />
来自您的服务行为,您需要删除mex端点:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
然而,这只是“模糊”它。为了避免除localhost之外的任何其他人调用 - 为什么不切换到netNamedPipeBinding
,这只是“在这台机器上设计” - 没有外部呼叫者能够调用该端点。
否则,您必须检查呼叫者的IP地址并根据该信息阻止它们 - 但这可能很容易被欺骗....
答案 1 :(得分:1)
我会切换到NetNamedPipeBinding
- 这本质上只是本地的,但也避免了一些额外的层,并且不需要访问任何端口(默认情况下非管理员没有)。这可以使用<netNamedPipeBinding>
元素在配置中完成。
答案 2 :(得分:0)
如果您在IIS中托管,则可以将站点绑定从“*”更改为“127.0.0.1”