Web浏览器与ArcGIS Pro插件通信实现可行性及解决方案咨询
可行性与PoC实现建议
这个功能在ArcGIS Pro中完全可行,你遇到的DLL缺失问题主要源于ArcGIS Pro的独立.NET运行时环境与ASP.NET Core依赖的加载冲突。以下是针对PoC的具体实现建议:
1. 优先使用.NET内置HttpListener做轻量HTTP服务
不需要引入ASP.NET Core的完整依赖,直接用.NET原生的HttpListener实现请求监听,快速验证Web应用与ArcGIS Pro插件的通信:
using System.Net; using System.Text.Json; // 在ArcGIS Pro插件的启动方法中初始化 public void Initialize() { var listener = new HttpListener(); listener.Prefixes.Add("http://localhost:5000/arcgis-pro/"); listener.Start(); // 后台线程处理请求 _ = Task.Run(async () => { while (listener.IsListening) { var context = await listener.GetContextAsync(); var request = context.Request; var response = context.Response; try { // 处理关联命令 if (request.Url.AbsolutePath.Equals("/arcgis-pro/associate", StringComparison.OrdinalIgnoreCase)) { var objectId = request.QueryString["objectId"]; var dbRecordId = request.QueryString["recordId"]; // 调用ArcGIS Pro SDK操作地图对象 bool success = await AssociateMapObject(objectId, dbRecordId); var result = new { Success = success, Message = success ? "关联成功" : "关联失败" }; var buffer = System.Text.Encoding.UTF8.GetBytes(JsonSerializer.Serialize(result)); response.ContentType = "application/json"; response.ContentLength64 = buffer.Length; await response.OutputStream.WriteAsync(buffer); } // 处理取消关联命令 else if (request.Url.AbsolutePath.Equals("/arcgis-pro/disassociate", StringComparison.OrdinalIgnoreCase)) { var objectId = request.QueryString["objectId"]; bool success = await DisassociateMapObject(objectId); var result = new { Success = success, Message = success ? "取消关联成功" : "取消关联失败" }; var buffer = System.Text.Encoding.UTF8.GetBytes(JsonSerializer.Serialize(result)); response.ContentType = "application/json"; response.ContentLength64 = buffer.Length; await response.OutputStream.WriteAsync(buffer); } } catch (Exception ex) { var errorBuffer = System.Text.Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new { Success = false, Message = ex.Message })); response.ContentLength64 = errorBuffer.Length; await response.OutputStream.WriteAsync(errorBuffer); } finally { response.Close(); } } }); } // 封装ArcGIS Pro地图对象关联逻辑 private async Task<bool> AssociateMapObject(string objectId, string dbRecordId) { // 调用ArcGIS Pro SDK获取目标要素并执行关联操作 var selectedFeatures = MapView.Active.Map.GetSelection(); // 此处添加与SQL数据库交互的关联逻辑 return true; } // 封装ArcGIS Pro地图对象取消关联逻辑 private async Task<bool> DisassociateMapObject(string objectId) { // 调用ArcGIS Pro SDK执行取消关联操作 return true; }
这种方式无额外依赖,直接利用.NET原生API,完全规避AspNetCore的DLL加载问题,适合快速完成PoC。
2. 用Named Pipes实现进程间通信
如果HTTP方式仍有问题,可选择Named Pipes做IPC通信,稳定性更高:
using System.IO.Pipes; using System.Text; // 插件启动时启动Pipe服务端 public void Initialize() { _ = Task.Run(async () => { while (true) { using var pipeServer = new NamedPipeServerStream("ArcGISProAssociationPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message); await pipeServer.WaitForConnectionAsync(); using var reader = new StreamReader(pipeServer, Encoding.UTF8); using var writer = new StreamWriter(pipeServer, Encoding.UTF8); var command = await reader.ReadLineAsync(); if (string.IsNullOrEmpty(command)) continue; var parts = command.Split('|'); string result = "失败"; if (parts[0] == "ASSOCIATE" && parts.Length == 3) { bool success = await AssociateMapObject(parts[1], parts[2]); result = success ? "关联成功" : "关联失败"; } else if (parts[0] == "DISASSOCIATE" && parts.Length == 2) { bool success = await DisassociateMapObject(parts[1]); result = success ? "取消关联成功" : "取消关联失败"; } await writer.WriteLineAsync(result); await writer.FlushAsync(); pipeServer.Disconnect(); } }); }
Web端只需作为Pipe客户端发送命令即可,无需处理HTTP相关的配置。
3. 解决ASP.NET Core依赖问题的方案(如果坚持用WebAPI)
若一定要使用ASP.NET Core WebAPI,需调整依赖部署方式:
- 将所有Microsoft.AspNetCore相关NuGet包的
Copy Local属性设为True,确保DLL复制到插件输出目录; - 在插件启动时添加AssemblyResolve事件,手动加载依赖:
using System.Reflection; AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name).Name; var assemblyPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), $"{assemblyName}.dll"); return File.Exists(assemblyPath) ? Assembly.LoadFrom(assemblyPath) : null; };
- 确保使用与ArcGIS Pro兼容的.NET版本(ArcGIS Pro 3.x对应.NET 6),选择匹配版本的AspNetCore包。
内容的提问来源于stack exchange,提问作者Professor
相关产品推荐
相关产品推荐

