2011-10-31 52 views
8

我刚刚学习wcf,无法理解一个非常基本的东西。wcf端点相对地址

我创建了一个WCF服务,我想在IIS中托管,就像使用它自己的路径(如http://myhost/myapp/和其他所有程序)的Web应用程序一样。

我创造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正确配置。

问题出现了。

我有一个WCF服务在IIS下工作,我想添加一个端点。例如,让它成为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呢?

回答

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> 
+0

我不知道我刚才做了什么,但我有一个工作net.tcp端点与空的“地址”参数。无论如何感谢您的帮助。 – pushist1y

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

+0

文件激活少让我摆脱.svc文件,但我看不出它如何帮助避免为net.tcp端点指定绝对主机地址。我想念什么? – pushist1y

+0

@ pushist1y在服务激活下有一个名为relativeAddress的属性,允许您指定访问服务的相对虚拟路径。这不适合你吗? – Craig