我想将netTcpBinding用于我目前在IIS7中托管的WCF应用程序,这意味着将其配置为使用WAS.这是相当直接的,但是,我的应用程序以前在global.asax文件中使用了Application_Start事件.我不需要访问httpContext(我理解IIS7中已经删除了访问权限),但我还是想挂钩启动或初始化方法?
在WAS中托管与IIS7相关的应用程序时是否存在等价物?
使用经典模式不是一个选项(我再次对httpcontext不感兴趣,如果使用http绑定,这似乎只能起作用) - 我已经看到了一个将静态类插入app_code文件夹的示例,该文件夹看起来像一个可怕的黑客.
我在SQL2005数据库中有一个负载很重的表(许多插入/更新/删除).我想尽可能接近实时地对所有这些更改进行一些后期处理(异步以便不以任何方式锁定表).我看了很多可能的解决方案,但似乎无法找到一个感觉正确的整洁解决方案.
后期处理的类型也相当繁重,以至于Windows侦听器服务实际上将处理传递给许多机器.然而,应用程序的这部分已经启动并运行,完全异步,而不是我需要帮助 - 我只是想提及这只是因为它影响设计决策,因为我们不能只加载一些CLR对象DB完成处理.
所以,简单的问题仍然存在:表中的数据更改,我想在远程服务器上的c#代码中进行一些处理.
目前我们已经提出使用一个sql触发器,它执行"xp_cmdshell"来启动一个引发windows服务正在侦听的事件的exe.这只是感觉很糟糕.
但是,我在网上看到的其他解决方案也让人感到相当费解.例如,设置SQLCacheDependancy还涉及必须设置Service Broker.另一个可能的解决方案是使用CLR触发器,它可以调用Web服务,但是这里有很多关于它的警告,这是一个糟糕的方法,尤其是在性能至关重要时.
理想情况下,我们不会对表格进行更改,而是会拦截我们的应用程序中的调用并从那里通知服务,遗憾的是,虽然我们有一些遗留应用程序也会对数据进行更改,并且监视表格是唯一的集中位置此时此刻.
非常感激任何的帮助.
摘要:
我有以下字典:
Dictionary<long, ChangeLogProcess> _changeLogProcesses =
new Dictionary<long, ChangeLogProcess>();
Run Code Online (Sandbox Code Playgroud)
我有一个方法试图在特定状态的字典中获取下一个changelogprocess(如果没有特定状态的项,则返回null):
var changeLogProcesses =
from entry in _changeLogProcesses
where (entry.Value.Status == status)
select entry.Value;
changeLogProcess = changeLogProcesses.FirstOrDefault<ChangeLogProcess>();
Run Code Online (Sandbox Code Playgroud)
但是,在执行期间,它在linq查询期间抛出了堆栈溢出异常?我做了很多测试,以确保列表中有项目等等,但问题仍然存在?
值得注意的是,此方法是在多线程环境中运行的服务的一部分.上面的linq查询(以及对它的所有访问,例如添加/删除到列表中的项目,或列表中项目的状态更改)都包含在ReaderWriterLockSlim写锁中.同样,我已经对它进行了广泛的调试,以确保在任何时候都不会有单个线程访问列表.
什么可能导致它堆栈溢出,因为与一些可能的其他错误相关,例如在查询期间修改列表?(再次,我在任何时候只有一个线程访问列表)
编辑:根据要求获取getter和setter代码:
public ChangeLogProcessStatus Status
{
get { return _status; }
set
{
//more that one place can initiate a retry now, so retry count is handled in the property setter
if (PreviousStatus <= ChangeLogProcessStatus.Waiting && value >= ChangeLogProcessStatus.RetryWaiting)
{
this.ChangeLog.Tries++;
//If it's retry waiting, remove this last service machine from the
//list …Run Code Online (Sandbox Code Playgroud)