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



假设我的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

可以吗?还是我需要为每个服务标签提供唯一的名称?

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

我的意图不是公开所有端点&地址。

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

也许不是您想要的,但您可以轻松地将另一个服务添加到您的项目中,并为其提供您希望客户端看到的端点。那么现有的服务可以只针对TCP,也可以同时针对这两种类型。当然,在这种情况下,两个服务都将运行相同的代码。

添加服务就像添加任何其他文件一样,右键单击,添加新项,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>

相关内容

  • 没有找到相关文章

最新更新