wcf端点相对地址

pus*_*t1y 9 wcf endpoint

我只是在学习wcf并且无法理解一个非常基本的东西.

我正在创建一个WCF服务,我想在IIS中托管,就像Web应用程序一样,它有自己的路径http://myhost/myapp/和所有东西.

我正在VS中创建WCF服务项目,我有一个*.svc描述它的文件,然后我像这样定义一个简单的端点:

<endpoint address="" 
          binding="basicHttpBinding" 
          contract="wcf_service_auth.IPshService" />
Run Code Online (Sandbox Code Playgroud)

然后我将这个服务像IIS Web应用程序一样发布到虚拟目录,我们假设它的名称psh_pub,所以我可以通过url访问该服务http://localhost/psh_pub/pshservice.svc/.它向我展示了WCF问候页面并给了我一个WSDL链接,它给了我正确的wsdl描述.

没关系.

下一步 - 我想添加一个MEX端点.我添加到配置:

<endpoint address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
Run Code Online (Sandbox Code Playgroud)

也没关系,端点可以在地址访问,http://localhost/psh_pub/pshservice.svc/mexWcfTestClient.exe从该URL提供正确的配置.

问题来了.

我有一个在IIS下工作的WCF服务,我想再添加一个端点.例如,让它成为一个net.tcp端点.IIS默认配置为接受net.tcp端口808的连接,我正在net.tcp为我的Web应用程序的属性添加协议,我想将端点添加到我的服务中:

<endpoint address=""
          binding="netTcpBinding" 
          contract="wcf_service_auth.IPshService"  />
Run Code Online (Sandbox Code Playgroud)

现在我假设我的服务应该可以通过网址访问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" />
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它的确有效.但是如果将服务托管在另一个虚拟目录中,我将需要更改配置.如果我在另一台服务器上托管它,我需要更改配置.如果我在多台服务器上托管它,我将必须维护与我拥有的服务器一样多的配置.

所以主要问题是:

是否有任何方法在WCF中指定net.tcpIIS托管的WCF服务的(或https)端点而不指定它的绝对URL?

mar*_*c_s 7

您应该能够为服务端点定义基址net.tcp:

<service name="YourServiceName">
   <host>
       <baseAddresses>
          <add baseAddress="net.tcp://localhost:808/psh_pub/" />
       </baseAddresses>
   </host>
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够在实际端点中使用相对地址:

   <endpoint name="Tcp01"
             address="pshservice.svc" 
             binding="netTcpBinding" 
             contract="wcf_service_auth.IPshService" />
</service>
Run Code Online (Sandbox Code Playgroud)