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