wcf 端点相对地址
Posted
技术标签:
【中文标题】wcf 端点相对地址【英文标题】:wcf endpoint relative address 【发布时间】: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?
【问题讨论】:
【参考方案1】:您应该能够为您的net.tcp
服务端点定义一个基地址:
<service name="YourServiceName">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:808/psh_pub/" />
</baseAddresses>
</host>
那么您应该能够在实际端点中使用相对地址:
<endpoint name="Tcp01"
address="pshservice.svc"
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
</service>
【讨论】:
我不知道我刚刚做了什么,但我有一个有效的 net.tcp 端点,其“地址”参数为空。无论如何感谢您的帮助。【参考方案2】:WCF 无文件激活 (.Net 4.0) 将允许您使用 relativeAddress 属性在相对虚拟路径下注册:
<system.serviceModel>
<serviceHostingEnvironment>
<serviceActivations>
<add relativeAddress="relative-virtual-path/yourservice.svc"
service="YourServiceImpl" />
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceModel>
相对于 Web 应用程序的基地址
这个链接谈到它:http://msdn.microsoft.com/en-us/library/ee354381.aspx
【讨论】:
无文件激活让我摆脱 .svc 文件,但我看不出它如何帮助避免为 net.tcp 端点指定绝对主机地址。我错过了什么吗? @pushist1y 在服务激活下有一个名为 relativeAddress 的属性,它允许您指定用于访问服务的相对虚拟路径。这不适合你吗?以上是关于wcf 端点相对地址的主要内容,如果未能解决你的问题,请参考以下文章