You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:49:52