我需要在我的应用程序中的某些事件上调用外部Web服务。我不想修改我的应用程序并使该外部Web服务具有任何依赖性。因此,我需要考虑使用某种外部组件来实现此目的。
一种可能的方法是我创建数据库视图,当我的应用程序中的某些事件发生时,它将被填满。然后我将在该视图上设置触发器,该触发器将调用CLR功能。在那个CLR函数中,我将调用外部Web服务。通过这样做,我将获得“实时”集成,这是好的。但是,这种方法有缺点。主要的一点是,似乎从CLR调用Web服务并不是一个好主意,因为它会阻止主SQL线程(?!),直到CLR收到一些答案。
到目前为止,我只发现设置此属性有助于解决性能问题:
System.Net.ServicePointManager.DefaultConnectionLimit = 9999
有关它的更多信息,您可以找到here。
现在,既然你知道我的需求(即实时或至少接近实时的集成而没有从我的应用程序到外部Web服务的任何调用),还有更好的方法吗?
我能想到的另一种方法是提供一些服务,它会定期检查我的数据库中需要触发外部Web服务调用的更改。一旦此服务检测到此类更改,它将调用Web服务并传输数据。当然,这不是真正的实时整合。我必须承认,除了性能问题之外,我更喜欢触发器和CLR,因为它保证了实时集成,并且对我的应用程序没有任何影响。
答案 0 :(得分:2)
我不确定我是否同意将Web服务调用移动到数据库的设计。但是,我确信您有理由不想更改应用程序。
以下是您可以尝试的几个选项 -
1)使用消息队列代替数据库和CLR进行Web服务调用。 NServiceBus是将事件发生传递为消息的好选择,可以触发此调用
2)如果您不习惯使用SQL Server存储事件,请查看SQL server Service broker