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