wcf端点相对地址

时间:2011-10-31 11:27:35

标签: wcf endpoint

我只是在学习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?

2 个答案:

答案 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