我有一个托管在 IIS6 上的 WCF 服务,并且我使用的是 .net 框架 3.5。我拥有的网站位于公共领域,我的意思是任何人都可以从任何地方访问。
我的问题是,有没有办法隐藏我的 WCF 服务?我可以很容易地查看我的页面的源代码或者确切地知道我的服务在页面后面的路径......
http://hostname.MyServiceName.svc?wsdl
,我该如何隐藏它?
我有一个托管在 IIS6 上的 WCF 服务,并且我使用的是 .net 框架 3.5。我拥有的网站位于公共领域,我的意思是任何人都可以从任何地方访问。
我的问题是,有没有办法隐藏我的 WCF 服务?我可以很容易地查看我的页面的源代码或者确切地知道我的服务在页面后面的路径......
http://hostname.MyServiceName.svc?wsdl
,我该如何隐藏它?
同意大卫的观点,只是“模糊”你的服务还不到解决方案的一半,你当然可以关闭
要做的是,确保您的<service>
标签没有引用<serviceBehavior>
包含该<serviceMetadata>
标签的 a。
所以这将暴露服务元数据(包括 HTTP 上的 WSDL):
<behaviors>
<serviceBehaviors>
<behavior name="default">
<serviceMetadata httpGetEnabled="True" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
<behaviors>
<services>
<service name="IYourService" behaviorConfiguration="default">
...
</service>
</services>
虽然这不会暴露任何服务元数据(观察<serviceMetadata>
标签的删除):
<behaviors>
<serviceBehaviors>
<behavior name="nometadata">
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
<behaviors>
<services>
<service name="IYourService" behaviorConfiguration="nometadata">
...
</service>
</services>
删除任何服务元数据时,您将无法再Add Service Reference
在 Visual Studio(或任何其他开发系统的等价物)中进行操作 - 服务不会告诉您可用的内容 - 您必须知道一些另一种方式。
这可以追溯到旧的“通过默默无闻的安全”辩论。隐藏您的服务并不是保护它的好方法或有效方法。考虑使用 SSL 和真正的身份验证方法,而不是仅仅试图“隐藏”它。
此外,要更直接地回答您的问题:如果浏览器知道您的服务地址(并且它必须让您的页面通过 JavaScript 或您有什么来调用它),那么任何人都可以轻松找到它。无论您如何尝试在页面源中隐藏 URL,在 Fiddler 或 Firebug 中监视 HTTP 事务以查看服务地址和请求的格式/内容都是一件简单的事情。
为什么要隐藏服务?有人认为这是一个真正的问题,还是您只是想保护自己?
有很多保护自己的策略……但如果只是随意的“不希望人们使用我的服务”,那么只需不时更改 API。没有什么比随机变化的 API 更能说明“停止”了。