2

我正在尝试编写两种完全不同类型的服务合同,这是一种应该支持多个客户端的(IService)。

[ServiceContract(CallbackContract = typeof(IClientCallBack), SessionMode = SessionMode.Required)]
public interface IService
{
    [OperationContract]
    void GetSquaredAsync();
}

public interface IClientCallBack
{
    [OperationContract(IsOneWay = true)]
    void Result(int i);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
class Service : IService
{
 void GetSquaredAsync(double x)
 {
   callback = OperationContext.Current.GetCallbackChannel<IClientCallBack>();
   callback.Result(x * x);
 }

这是另一个只允许 1 个客户端的情况:

[ServiceContract(SessionMode = SessionMode.Required)]
public interface ISuperUser
{
    [OperationContract]
    string WhoIsSpecial(string name);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
public class SuperUser : ISuperUser
{
    public string WhoIsSpecial(string name)
    {
        return String.Format("{0} is special ^_^", name);
    }
}

这只是一个示例,因为我的实际 ServiceContracts 与实现太大而无法在此处发布,但想法是相同的。我希望一个 ServiceContract 检查服务,只有几个可用的函数调用和一个不同的 ServiceContract,它使用回调并授予对由于同步问题而在任何给定时间我希望只有 1 个客户端可以访问的功能的访问权限。我可以让一个服务主机同时支持这两个 ServiceContracts 吗?

4

1 回答 1

3

好吧,我仍然无法为我的每个服务使用不同的 ConcurrencyModes,但我发现您可以将多个服务合同组合成一个,就像在这个例子中一样

class Service : IService, ISuperUser
{
    void GetSquaredAsync(double x)
    {
        callback = OperationContext.Current.GetCallbackChannel<IClientCallBack>();
        callback.Result(x * x);
    }

    public string WhoIsSpecial(string name)
    {
        return String.Format("{0} is special ^_^", name);
    }
}

然后我为每个接口启动一个具有不同端点的服务主机。

ServiceHost host = new ServiceHost(typeof(Service), httpUrl);

host.AddServiceEndpoint(typeof(IService), new NetTcpBinding(), IServiceUrl);
host.AddServiceEndpoint(typeof(ISuperUser), new NetTcpBinding(), ISuperUserUrl);

host.Open();

然后,我可以从客户端独立访问任一服务合同,具体取决于我要使用哪个服务合同,而不会暴露另一个服务合同的功能。这也允许我拥有一组使用回调的函数和另一组不使用回调的函数。希望这对其他人有帮助。

于 2013-09-03T14:52:19.757 回答