ASP.NET Core MVC调用.NET控制台应用失败:自定义URI协议问题
从ASP.NET Core MVC Web应用启动.NET控制台应用失败问题
我尝试从ASP.NET Core MVC Web应用中启动一个.NET控制台应用,希望无需知晓文件路径就能远程启动它。已经在注册表中创建了对应键值,但点击Web应用中的启动链接时,控制台应用启动失败。
控制台应用代码
using Microsoft.Win32; Console.WriteLine("Listening.."); // 获取文件当前下载位置 var loc = System.Reflection.Assembly.GetExecutingAssembly().Location; if (!Directory.Exists(@"C:\Console\")) { System.IO.Directory.CreateDirectory(@"C:\Console\"); } // 在指定文件夹创建下载目录 if (!File.Exists(@"C:\Console\" + loc.Split('\\').Last())) { File.Move(loc, @"C:\Console\" + loc.Split('\\').Last()); } var KeyTest = Registry.CurrentUser.OpenSubKey("Software", true).OpenSubKey("Classes", true); RegistryKey key = KeyTest.CreateSubKey("alert"); key.SetValue("URL Protocol", "wnPing"); key.CreateSubKey(@"shell\open\command").SetValue("", @$"C:\Console\{loc.Split('\\').Last()} %1");
MVC视图(index.cshtml)代码
@{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <p><a href="alert:wmPing?id=string">在控制台应用中打开</a>.</p> </div>
相关信息
- C:\Console\目录内容:目录下存在控制台应用的可执行文件
- 注册表配置:已在
HKEY_CURRENT_USER\Software\Classes下创建alert项,设置了URL Protocol值为wnPing,并在shell\open\command路径下配置了启动命令 - 启动错误:点击Web应用中的链接后,系统弹出提示无法找到对应应用,要求检查路径并重试
排查与解决建议
校验注册表启动路径
检查shell\open\command中的可执行文件路径是否与C:\Console\下的文件名完全一致,若路径包含空格,必须用双引号包裹,格式应为:"C:\Console\你的应用文件名.exe" %1修正文件移动逻辑
当前代码启动时会将自身从原路径移动到C:\Console\,移动后原路径文件消失,若注册表写入时用的是移动前的路径,后续启动会失败。建议改为复制文件而非移动,或者确保注册表写入的是移动后的最终路径:// 替换原File.Move代码 var targetPath = Path.Combine(@"C:\Console\", Path.GetFileName(loc)); if (!File.Exists(targetPath)) { File.Copy(loc, targetPath, true); } // 注册表写入时直接用targetPath key.CreateSubKey(@"shell\open\command").SetValue("", $"\"{targetPath}\" %1");检查浏览器权限
部分浏览器会拦截自定义URL协议的启动请求,需在浏览器弹窗中选择允许启动该应用测试无参数启动
暂时将注册表中的启动命令改为只启动可执行文件(去掉%1参数),测试是否能正常启动,排除参数解析问题
内容的提问来源于stack exchange,提问作者Sofiane Hachemaoui
相关产品推荐
相关产品推荐

