我刚刚转移到使用大量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#代码?
答案 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>