WCF服务器端设置可由客户端应用程序更改

时间:2012-10-16 15:25:26

标签: .net wcf

我有一个WCF服务,它将文件作为reqeusts处理,处理文件,并将响应异步返回给客户端。我想添加一种能力,让不同的客户端控制服务生成的响应的类型和数量。

例如,我的服务可能会返回良好的响应,错误的响应和错误响应。我希望UI客户端能够打开/关闭每个响应类型并更改返回的好/坏响应的数量。

这是我目前的服务:

[ServiceContract(
SessionMode = SessionMode.Required,
CallbackContract = typeof(IEmulatorServiceCallback))]
public interface IEmulatorService
{
    [OperationContract]
    void Submit(TransferredFile file);

    [OperationContract]
    bool Subscribe();

    [OperationContract]
    bool Unsubscribe();
}

[ServiceContract]
public interface IEmulatorServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void OnResponseReady(TransferredFile file);
}

在客户端,我有以下内容。

public interface IResponseListener : IEmulatorServiceCallback
{
    event EventHandler<MessageEventArgs> OnMessageReceived;
    bool Connect();
    void Disconnect();
}

[CallbackBehavior(
    ConcurrencyMode = ConcurrencyMode.Single,
    UseSynchronizationContext = false)]
[Export(typeof(IResponseListener))] // MEF
public class CallbackListener : IResponseListener
{
    // Sets up and creates the service to be used.
    public CallbackListener()
    {
        DuplexChannelFactory<IEmulatorService> pipeFactory =
              new DuplexChannelFactory<IEmulatorService>(
                  new InstanceContext(this),
                  new NetTcpBinding(),
                  new EndpointAddress("net.tcp://localhost:8000/EmulatorService"));

        _service = pipeFactory.CreateChannel();
    }

    // Connects & Subscribes as service callback
    public bool Connect() { /* Code removed */ }

    // Removed as service callback
    public void Disconnect() { /* Code removed */ }

    // Implementation of interface that raises event to be captured by client   
    public void OnResponseReady(TransferredFile file) { /* Code removed */ }

    [Export]
    IEmulatorService _service;

    // Event raised when the OnResponseReady method is called
    public event EventHandler<MessageEventArgs> OnMessageReceived;
}

public interface IServiceProxy
{
    void SendMessage(string path);       
}

[Export(typeof(IServiceProxy))]
public class EmulatorServiceProxy : IServiceProxy
{
    public void SendMessage(string path)
    {
        var file = new TransferredFile(
            File.ReadAllBytes(path),
            Path.GetFileName(path));

        EmulatorService.Submit(file);
    }

    [Import]
    public IEmulatorService EmulatorService { get; set; }
}

不要太深入到完整的实现,但是有一个客户端的引导程序从MEF获取IResponseListener和IServiceProxy,然后将它们传递到ViewModel的构造函数中以便在那里使用。因此,绑定到WPF应用程序的ViewModel实际上使用IServiceProxy和IResponseListener来更新模型。

我希望使用上述服务合同的客户很可能与控制设置的客户(响应类型/数量)不同。我相信会有一个客户端根据用户的请求设置设置,另一个客户端(一个单独的应用程序的一部分)将发送请求并接收异步响应。

所以,我只是不确定如何处理这个问题。我正在考虑以下几种方式: 1)拥有一个完全独立的服务,允许客户端更改设置,然后以某种方式让服务共享设置合同。 2)添加此服务实现的第二个接口(用于设置),设置合同也将在服务中。

第一种方法,我认为分享这些设置会很困难。但是,我正在使用MEF,因此可能会更容易。

至于第二种方法,这甚至会起作用吗?我可以使用相同的服务类实现两个服务合同吗?如果是这样,我是否必须单独主持服务?

我想另一个选择就是在同一个服务中拥有所有设置方法,但是如果可能的话我想将它们分开,以便当一个不关心设置的客户端连接时,他们不会我不得不担心这些方法。

有没有人必须做类似的事情?你会推荐什么方法?

由于

-g

0 个答案:

没有答案