如何在WCF中停止在客户端公开多个端点

时间:2014-09-24 14:19:05

标签: wcf wcf-endpoint

假设我的wcf具有许多具有不同绑定的端点。因此,当用户/客户端从VS IDE添加服务引用时,则多个端点相关数据公开&在客户端的客户端配置文件中添加。

我们能否以这样的方式设计服务,结果只会在客户端显示一个与端点相关的地址?

假设我有一个服务使用HTTP& TCP相关端点,我想当外部客户从他们的VS IDE添加我们的服务,然后他们将看到我们的HTTP端点地址而不是TCP。所以指导我怎么能这样做?如何根据我的要求设计服务端配置文件?

这里我附加了一个与配置文件中相关的多个端点的小样本代码。

<services>
            <service behaviorConfiguration="MulContractService" name="MyWCFLibrary.MultipleContract">
                <clear />
                <endpoint binding="basicHttpBinding" bindingConfiguration="MulContractBasicBinding"
                    name="MulContractBasicEndPoint" contract="MyWCFLibrary.IMultipleContract"
                    listenUriMode="Explicit">
                    <identity>
                      <dns value="localhost" />
                        <certificateReference storeName="My" storeLocation="LocalMachine"
                            x509FindType="FindBySubjectDistinguishedName" />
                    </identity>
                </endpoint>
                <endpoint address="test1" binding="wsHttpBinding" bindingConfiguration="MulContractWsHttpBinding"
                    name="MulContractWsHttp" contract="MyWCFLibrary.IByeWorld"
                    listenUriMode="Explicit">
                    <identity>
                      <dns value="localhost" />
                        <certificateReference storeName="My" storeLocation="LocalMachine"
                            x509FindType="FindBySubjectDistinguishedName" />
                    </identity>
                </endpoint>
                <endpoint address="test1" binding="wsHttpBinding" bindingConfiguration="MulContractWsHttpBinding"
                    name="MulContractWsHttp" contract="MyWCFLibrary.IHelloWorld"
                    listenUriMode="Explicit">
                    <identity>
                      <dns value="localhost" />
                        <certificateReference storeName="My" storeLocation="LocalMachine"
                            x509FindType="FindBySubjectDistinguishedName" />
                    </identity>
                </endpoint>
                <endpoint address="net.tcp://localhost:8733/Design_Time_Addresses/MyWCFLibrary/MultipleContract/"
                    binding="netTcpBinding" bindingConfiguration="MulContractTCPBinding"
                    name="MulContractTCPEndPoint" contract="MyWCFLibrary.IMultipleContract" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyWCFLibrary/MultipleContract/" />
                    </baseAddresses>
                </host>
            </service>
        </services>

修改

这里我给出了我的新完整代码,并指导我做到了吗?

namespace CustomService
{

    [ServiceContract]
    public interface IEmp
    {
        [OperationContract]
        string GetEmp();

    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class BusinessLayer : IEmp
    {
        public BusinessLayer()
        {

        }
        public string GetEmp()
        {
            return "Casino";
        }

    }
} 

Config code at service end

<services>
      <service name="CustomService.BusinessLayer">

        <endpoint address="CustomerFactory" binding="basicHttpBinding"
          bindingConfiguration="HTTPBindingConfig" name="CustomerFactoryHTTP"
          contract="CustomService.IEmp" listenUriMode="Explicit" />
      </service>

      <service name="CustomService.BusinessLayer">
        <endpoint binding="basicHttpBinding" bindingConfiguration="HTTPBindingConfig"
          name="CustomerMasterHTTP2" bindingName="CustomerMaster" contract="CustomService.IEmp" />
      </service>
</services>

告诉我上面的配置会有效吗?

在上面的配置中我定义了两个具有相同名称的服务标签,因为我的服务器全名和命名空间是CustomService.BusinessLayer

没关系,还是我需要为每个服务标签提供唯一的名称?

我的意图是我将拥有相同的服务,但有多个服务标签,当客户将最终添加我的服务参考时,他们将无法看到所有端点。

我的意图是不公开所有端点&amp;给每个客户解决。

所以指导我做了什么它是否有效....如果没有那么纠正我的配置条目并告诉我如何限制我的端点不暴露每个绑定&amp;所有客户之前的地址。感谢

1 个答案:

答案 0 :(得分:0)

可能不是您正在寻找的内容,但您可以轻松地向项目中添加其他服务,并为其提供您希望客户看到的端点。然后,现有服务可能只适用于TCP或两种类型。当然,两个服务都会运行相同的代码。

添加服务就像添加任何其他文件一样,右键单击,添加New Item,WCF服务。然后,如果您不想手动执行,可以使用WCF配置编辑器进行配置。

这里有什么值得的配置有两个服务。您可以看到第一个服务有两个端点,一个Http和一个TCP,而第二个服务只暴露了http端点。然后,您的两个服务将实现IService,并将委托给公共类或库。

<services>
  <service name="Mynamespace.Service1">
    <endpoint binding="basicHttpBinding"
      bindingConfiguration="HTTPBindingConfig" name="MyserviceHTTP"
      contract="Mynamespace.IService" listenUriMode="Explicit">
    </endpoint>
    <endpoint  binding="netTcpBinding"
      bindingConfiguration="TCPSecured" name="MyserviceHTTP"
      contract="Mynamespace.IService" />
  </service>
     <service name="Mynamespace.Service2">
   <endpoint binding="basicHttpBinding"
      bindingConfiguration="HTTPBindingConfig" name="MyserviceHTTP"
      contract="Mynamespace.IService" listenUriMode="Explicit">
    </endpoint>
  </service>
</services>