我有一个 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