2

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

例如,我的服务可能会返回好的响应、坏的响应和错误响应。我希望 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

4

0 回答 0