【发布时间】:2011-12-18 16:16:39
【问题描述】:
我只是在学习 wcf,无法理解一件非常基本的事情。
我正在创建一个 WCF 服务,我想将它托管在 IIS 中,就像 Web 应用程序一样,它有自己的路径,如 http://myhost/myapp/ 和一切。
我正在 VS 中创建 WCF 服务项目,我有一个描述它的 *.svc 文件,然后我像这样定义一个简单的端点:
<endpoint address=""
binding="basicHttpBinding"
contract="wcf_service_auth.IPshService" />
然后我将这个服务像一个 IIS Web 应用程序一样发布到一个虚拟目录,假设它的名称为psh_pub,所以我可以通过 url http://localhost/psh_pub/pshservice.svc/ 访问该服务。它向我展示了 WCF 问候页面,并为我提供了 WSDL 的链接,它为我提供了正确的 wsdl 描述。
没关系。
下一步 - 我想添加一个 MEX 端点。我添加到配置:
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
没关系,端点可以在地址http://localhost/psh_pub/pshservice.svc/mex 访问,WcfTestClient.exe 给了我来自该 url 的正确配置。
问题来了。
我有一个在 IIS 下工作的 WCF 服务,我想再向它添加一个端点。例如,让它成为一个net.tcp 端点。 IIS 默认配置为在端口 808 上接受 net.tcp 连接,我将 net.tcp 协议添加到我的 Web 应用程序的属性中,我想像这样向我的服务添加一个端点:
<endpoint address=""
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
现在我假设我的服务应该可以通过 url net.tcp://localhost:808/psh_pub/pshservice.svc 访问。但事实并非如此。网络上的每个“操作方法”和手册都告诉我应该在配置文件中指定完整地址,如下所示:
<endpoint address="net.tcp://localhost:808/psh_pub/pshservice.svc"
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
如果我这样做,它会起作用。但是如果将服务托管在另一个虚拟目录中,我需要更改配置。如果我在另一台服务器上托管它,我需要更改配置。如果我将它托管在多台服务器上,我将不得不维护与我拥有的服务器一样多的配置。
所以主要问题是:
WCF 中是否有任何方法可以指定 IIS 托管的 WCF 服务的 net.tcp(或 https)端点,而无需为其指定绝对 url?
【问题讨论】: