我只是在学习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
可以从该网址获得正确的配置。
问题来了。
我有一个在IIS下工作的WCF服务,我想再添加一个端点。例如,让它成为net.tcp
端点。默认情况下,IIS配置为在端口808接受net.tcp
连接,并且我将net.tcp
协议添加到我的Web应用程序的属性中,并且我想将端点添加到我的服务中:
<endpoint address=""
binding="netTcpBinding"
contract="wcf_service_auth.IPshService" />
现在我假设我的服务应该可以通过网址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?
答案 0 :(得分:7)
您应该能够为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>
答案 1 :(得分:4)
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