小编Dan*_*ler的帖子

WCF路由服务 - 动态错误处理

我正在学习使用WCF路由服务可以做些什么.仍然在'拧紧它,看看它能做什么'阶段.

我对路由服务的理解是,当消息通过时,服务将尝试将其传递给备份列表中首先出现的任何端点.如果失败了,它将继续尝试下一个,然后是下一个,直到任何一个有效或者没有什么可以尝试.

我想做的是访问该失败事件,以便我可以:

  1. 记录失败
  2. 通过电子邮件发送端点失败的通知
  3. (可选)从备份列表中删除端点,以便它不会减慢将来的消息流过系统的速度

无法找到如何扩展WCF框架以获取此特定事件.

这是WCF路由服务可以做的事情吗?任何朝着正确方向的推动都将非常感激.


目前,我在IIS下托管了30-beh动态生成的路由服务(或者更准确地说,是Visual Studio 2010的ASP.NET开发服务器).我正在设置Global.asax中服务的路由,如下所示.

    protected void Application_Start(object sender, EventArgs e)
    {
        List<Type> serviceTypes = ServiceUtility.GetServiceTypes();
        foreach (Type st in serviceTypes)
        {
            string route = String.Format("Services/{0}.svc", ServiceUtility.GetServiceName(st));
            RouteTable.Routes.Add(new ServiceRoute(route, new RoutingServiceHostFactory(st), typeof(System.ServiceModel.Routing.RoutingService)));
        }
    }
Run Code Online (Sandbox Code Playgroud)

ServiceUtility和RoutingServiceHostFactory是自定义类.请注意,IPolicyService是我感兴趣的程序集中的WCF服务契约接口.

public static class ServiceUtility
{
    public static List<Type> GetServiceTypes()
    {
        Type policyInterfaceType = typeof(IPolicyService);
        Assembly serviceContractsAssembly = Assembly.GetAssembly(policyInterfaceType);
        Type[] serviceContractsAssemblyTypes = serviceContractsAssembly.GetTypes();

        List<Type> serviceTypes = new List<Type>();
        foreach (Type t in serviceContractsAssemblyTypes)
        {
            if (!t.IsInterface)
                continue;

            object[] attrib = …
Run Code Online (Sandbox Code Playgroud)

c# wcf wcf-routing custom-error-handling

6
推荐指数
1
解决办法
1591
查看次数

单元测试后无法删除数据库

答案:我没有清理我的ConnectionPools.

解决的方案是:

建立:

  1. 检查本地实例上是否存在"TEMP_NUnit"数据库(SQL Server 2005)
  2. 如果存在,请将其丢弃.
  3. 创建一个名为"TEMP_NUnit"的新空白数据库.

测试:

  1. 实例化"升级数据库"组件.
  2. 检查组件的基本属性是否正确默认.
  3. 将组件指向空白数据库并调用.Upgrade()
  4. 检查升级是否真的有效

拆除:

  1. SqlConnection.ClearAllPools();
  2. 删除'TEMP_NUnit'数据库.

原始问题在首页.


大家好

测试场景是:

建立:

  1. 检查本地实例上是否存在"TEMP_NUnit"数据库(SQL Server 2005)
  2. 如果存在,请将其丢弃.
  3. 创建一个名为"TEMP_NUnit"的新空白数据库.

测试:

  1. 实例化"升级数据库"组件.
  2. 检查组件的基本属性是否正确默认.
  3. 将组件指向空白数据库并调用.Upgrade()
  4. 检查升级是否真的有效

拆除:

  1. 删除'TEMP_NUnit'数据库.

一切都很顺利,直到我进入TearDown阶段.我总是得到以下错误:

无法删除数据库"TEMP_NUnit",因为它当前正在使用中.

这让我感到困惑,因为我正在关闭(在finally语句中显式调用conn.Close)并正确地处理(通过using语句)我的所有DbConnection对象.在TearDown到来之前,"TEMP_NUnit"数据库中不应该有任何运行.

如果我关闭NUnit然后重新打开它,SetUp的第2步总是先行.

我不确定我在这里做错了什么.任何指向正确的方向将不胜感激.

database connection nunit

5
推荐指数
1
解决办法
887
查看次数