Service Broker /外部应用程序激活和Visual Studio调试

时间:2016-03-15 14:55:32

标签: c# sql-server visual-studio sql-server-2012 service-broker

我刚刚转移到使用大量Service Broker功能的代码库。

我的EAService.config设置如下

<ApplicationService name="NotificationTest" enabled="true">
  <OnNotification>
    <ServerName>MyServer\MyInstance</ServerName>
    <DatabaseName>MyDatabase</DatabaseName>
    <SchemaName>dbo</SchemaName>
    <QueueName>MyQueueName</QueueName>
  </OnNotification>
  <LaunchInfo>
    <ImagePath>C:\SomeFolder\SomeConsoleApp.exe</ImagePath>
    <CmdLineArgs>myCommandLineArg1</CmdLineArgs>
    <WorkDir>C:\SomeFolder\</WorkDir>
  </LaunchInfo>
  <Concurrency min="1" max="1" />
</ApplicationService>   

当我尝试调试上面的代码时,我的问题出现了。

由于Service Broker外部激活器(C:\ Program Files \ Service Broker \ External Activator \ Bin \ ssbeas.exe)正在实例化代码....这不是(据我所知)我可以运行的东西在“调试模式”中等待调用进入并设置断点。

例如,对于一个WEBAPI项目,我可以执行传统的Start / Debug,并在ApiController / Method上放置一个断点,当一个请求进来时,它会在断点上中断,我可以拿起从那里调试。

使用Service Broker,它实例化一些.exe ....并且.exe​​可能会如此快速地打开和关闭,我无法“搜索并找到”将调试器附加到它。

我还想过,“也许我会让Service Broker向WCF服务发送消息”,但根据我在此SOF帖子中所读到的内容,看起来它实现起来是不可能或非常麻烦的:

Service Broker and WCF interoperability

我是否仍然在EAService.config中进行上述设置并让调试器中断,如下图所示?

或者有没有人想出一种非hacky方法来调试Service Broker“激活”的C#代码?

Simple Console App

2 个答案:

答案 0 :(得分:2)

您有几种选择:

一个。修改EAConfig以在调试器下启动程序:

  <ImagePath>C:\PathToDebugger\YourDebuggerOfChoice.exe</ImagePath>
  <CmdLineArgs>C:\SomeFolder\SomeConsoleApp.exe myCommandLineArg1</CmdLineArgs>

B中。使用GFlags图像执行选项将调试器添加到您的应用中 C.使用Debugger.Launch()从应用程序本身启动调试器 D.禁用EA并直接从VS(F5)运行应用程序,以进行调试,然后启用EA。

答案 1 :(得分:0)

所以这就是我最终得到的......作为我能找到的最一致的方法。

    static void Main(string[] args)
    {

        try
        {

#if DEBUG
            int index = Array.FindIndex(args, x => x.Equals("LAUNCHDEBUGGER", StringComparison.OrdinalIgnoreCase));
            if (index > -1)
            {
                System.Diagnostics.Debugger.Launch();
            }
#endif
 <LaunchInfo>
    <ImagePath>C:\SomeFolder\SomeConsoleApp.exe</ImagePath>
    <CmdLineArgs>myCommandLineArg1 LAUNCHDEBUGGER</CmdLineArgs>
    <WorkDir>C:\SomeFolder\</WorkDir>
  </LaunchInfo>