前几节开发Dapr应用程序时,我们使用 dapr cli 来启动dapr服务,就像这样:
dapr run --dapr-http-port 3501 --app-port 5001 --app-id frontend dotnet .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll
如果你想要通过dapr调试服务呢?在这里使用 dapr 运行时(daprd) 来帮助实现这一点。具体原理就是先从命令行中运行符合正确参数的 daprd,然后启动您的代码并附加调试器。
1.配置launch.json
vscode打开项目,并创建launch.json
修改launch.json的preLaunchTask,自定义名字,preLaunchTask将引用在 tasks.json 文件中定义的任务。
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Frontend-.NET Core Launch (web)", "type": "coreclr", "request": "launch", //"preLaunchTask": "build", "preLaunchTask": "daprd-frontend", "program": "${workspaceFolder}/FrontEnd/bin/Debug/net5.0/FrontEnd.dll", "args": [], "cwd": "${workspaceFolder}/FrontEnd", "stopAtEntry": false, "serverReadyAction": { "action": "openExternally", "pattern": "\\bNow listening on:\\s+(https?://\\S+)" }, "env": { "ASPNETCORE_ENVIRONMENT": "Development" }, "sourceFileMap": { "/Views": "${workspaceFolder}/Views" } }, { "name": ".NET Core Attach", "type": "coreclr", "request": "attach" } ] }
2.配置task.json
需要在task.json文件中定义一个 daprd task和问题匹配器(problem matcher)。 这里有两个通过上述 preLaunchTask 成员引用。 在 dpred -frontend task下,还有一个dependsOn成员,它引用build任务,以确保最新的代码正在运行/调试。 用了 problemMatcher,这样当 daprd 进程启动和运行时,VSCode 就能够知道。
{ "version": "2.0.0", "tasks": [ { "label": "build", "command": "dotnet", "type": "process", "args": [ "build", "${workspaceFolder}/FrontEnd/FrontEnd.csproj", "/property:GenerateFullPaths=true", "/consoleloggerparameters:NoSummary" ], "problemMatcher": "$msCompile" }, { "label": "publish", "command": "dotnet", "type": "process", "args": [ "publish", "${workspaceFolder}/FrontEnd/FrontEnd.csproj", "/property:GenerateFullPaths=true", "/consoleloggerparameters:NoSummary" ], "problemMatcher": "$msCompile" }, { "label": "watch", "command": "dotnet", "type": "process", "args": [ "watch", "run", "${workspaceFolder}/FrontEnd/FrontEnd.csproj", "/property:GenerateFullPaths=true", "/consoleloggerparameters:NoSummary" ], "problemMatcher": "$msCompile" }, { "label": "daprd-frontend", "command": "daprd", "args": [ "-app-id", "frontend", "-app-port", "5001", "-dapr-http-port", "3501", "-placement-host-address", "localhost:6050", "-components-path", "C:\\Users\\chesterychen\\.dapr\\components" ], "isBackground": true, "problemMatcher": { "pattern": [ { "regexp": ".", "file": 1, "location": 2, "message": 3 } ], "background": { "beginsPattern": "^.*starting Dapr Runtime.*", "endsPattern": "^.*waiting on port.*" } }, "dependsOn": "build" }, ] }
因为没有使用 dapr run* cli 命令, 所以运行 daprd list 命令将不会显示当前正在运行的应用列表。
3.调试
在StateController.GetAsync中新增断点,运行并调用http://192.168.43.94:3501/v1.0/invoke/frontend/method/State。
4.不用vscode调试
cmd运行以下命令,监听5001端口
daprd run -dapr-http-port 3501 -app-port 5001 -app-id frontend -placement-host-address localhost:6050 -components-path C:\\Users\\chesterychen\\.dapr\\components
然后直接vs运行项目,即可调试