我目前正在研究ac#.NET桌面应用程序,它将通过WCF和WCF数据服务通过Internet与数据库进行通信.应用程序中有许多位置可能需要在某个时间间隔内刷新.最简单的解决方案是将这些区域放在计时器上并重新查询数据库.但是,由于成千上万的客户端连接到服务层并因此连接到数据库,因此这些操作对服务器来说非常昂贵.
我考虑的是创建一个由客户端轮询的RSS提要,并让客户知道何时需要更新这些特定区域.RSS源将由一个服务进行管理,该服务轮询数据库以进行更改,或者遍历由客户端发出的WCF请求排队的项列表.
我还考虑过从客户端到服务器创建一些直接和连续的连接,但我不确定从客户端打开哪些出站防火墙端口.我可能只能依靠端口80/443.
所以我的问题是人们成功解决这个问题的解决方案是什么?有人做过RSS吗?Microsoft Sync Services?客户端和服务器之间通过WCF通过某个保存端口进行双向通信?
任何想法都非常感谢.
我目前正在使用WCF后端处理WPF应用程序.我们已经实现了客户端日志记录解决方案和用于异常处理的服务器日志记录解决方案,并且它们运行良好,但通常很难通过网络将信息绑定在一起.如果在服务器上发生异常,我想要一种方法将异常令牌传回到线路,以便我可以在客户端上将其记录,但异常.这样,当我在解决客户端错误时遇到问题时,我可以很容易地将其与服务器异常相关联.
我想提供一些关于我们架构的更多信息,然后我会陈述我的问题.
我们的WCF实现比设置服务引用的开箱即用方法更强大.我们在客户端上实现了动态代理生成.我们通过创建客户端和服务器共享的Web服务接口来完成此任务,并使用Castle.DynamicProxy.ProxyGenerator类和CreateInterfaceProxyWithoutTarget方法来创建代理.另外,当我们调用CreateInterfaceProxyWithoutTarget方法时,我们指定一个IInterceptor实现.在服务器上有三个主要类,用于跟踪和故障行为:
FaultOperationInvoker(Implements IOperationInvoker):尝试使用IOperationInvoker.Invoke调用服务方法.如果是故障异常类型,则重新抛出,如果是异常,则尝试确定是否存在具有特定详细信息类型的故障合同,如果是,则进行换行,然后使用详细信息引发新的故障异常.
internal class FaultOperationInvoker : IOperationInvoker
{
IOperationInvoker innerOperationInvoker;
FaultDescription[] faults;
public FaultOperationInvoker(IOperationInvoker invoker, FaultDescription[] faults)
{
this.innerOperationInvoker = invoker;
this.faults = faults;
}
#region IOperationInvoker Members
object[] IOperationInvoker.AllocateInputs()
{
return this.innerOperationInvoker.AllocateInputs();
}
object IOperationInvoker.Invoke(object instance, object[] inputs, out object[] outputs)
{
try
{
return this.innerOperationInvoker.Invoke(instance, inputs, out outputs);
}
catch (FaultException e)
{
ServerLogger.GetLogger(instance.GetType().FullName).LogException(e, "Unhandled exception in service operation.");
//allow fault exceptions to bubble out
throw;
}
catch (Exception e)
{
Type exceptionType = e.GetType(); …Run Code Online (Sandbox Code Playgroud)