☰
旧系统接入大模型的MCP适配层实践指南
2026/9/26 14:03:17 网站建设 项目流程

1. 项目概述:为什么老系统必须“带电升级”,而不是推倒重来

你手头那个运行了八年、数据库还是 SQL Server 2012、后台用着 Java EE 5 的订单审核系统,界面是 IE6 兼容模式,部署在 Windows Server 2016 虚拟机上——它没坏,客户每天还在用,运维同事说“只要不碰配置,能再撑三年”。但老板上周开会拍了桌子:“隔壁部门用 AI 自动生成质检报告,效率翻三倍;我们还在人工核对 Excel 表格。不是要你换系统,是要你让这个系统‘会说话’‘能思考’‘懂业务’。”

这就是“旧系统平台接入 MCP 实践指南”要解决的真实问题。这里的MCP不是某个具体厂商的私有协议,而是指代一种模型能力代理(Model Capability Proxy)架构范式:它不修改原有系统一行核心代码,不迁移数据库,不替换中间件,而是在老系统与大模型之间,插入一个轻量、可控、可审计的“翻译层+调度层+安全阀”。它把 AI 能力像水电一样接进老厂房的既有管线,而不是拆掉屋顶重盖智能工厂。

关键词里反复出现的“SQL Server”“Windows Server”“login server error”“token exchange failed”,恰恰暴露了当前实践中的典型断点:不是模型调不动,而是老系统根本没设计过“接收 token”“解析 JSON 响应”“处理流式输出”这些现代 API 交互契约。它习惯收 XML 请求、返回 HTML 页面、靠 session ID 维持状态——而大模型服务端只认 OAuth2.0 bearer token、期待 SSE 流或标准 RESTful JSON。这个鸿沟,就是 MCP 适配层存在的全部意义。

适合谁看?不是给 AI 算法工程师,而是给那些被叫去“给 ERP 接上 ChatGPT”的后端开发、被要求“让 OA 系统支持智能问答”的集成架构师、以及天天在 IIS 和 SQL Server Management Studio 之间切换的运维老哥。你不需要从零训练模型,但必须清楚:老系统的 HTTP 请求头里缺哪个字段会导致 token 交换失败;SQL Server 的datetime类型和大模型返回的 ISO8601 时间戳怎么对齐;IE 兼容模式下 JavaScript 怎么安全注入 MCP 客户端脚本。这篇指南,就是写给这些真正在生产环境里拧螺丝的人。

2. 整体设计思路:三层解耦,让老系统“假装自己很新”

2.1 为什么拒绝“直接调用大模型 API”这种看似简单的方案?

我见过三个团队踩过这个坑。第一个团队让 Java 后端直接用RestTemplate调用 OpenAI API,结果上线三天,因Connection reset by peer错误导致订单审核页面白屏——老系统线程池只有 20 个,而大模型响应平均耗时 3.2 秒,高峰期并发请求瞬间打满线程池。第二个团队尝试在 ASP.NET WebForms 的.aspx页面里用 jQuery AJAX 调用 Claude 接口,结果 IE11 报错XMLHttpRequest cannot load https://api.anthropic.com/v1/messages due to access control checks,因为老系统域名和大模型 API 域名跨域,而 IE11 对 CORS 的兼容性极差。第三个团队更激进,把 Llama3 模型本地部署在 Windows Server 上,结果发现 SQL Server 和 Python 进程抢内存,SQL Server 报Error: 701, Severity: 17, State: 123(内存不足),整个数据库卡死。

这些失败共同指向一个结论:老系统不是“能力弱”,而是“契约不匹配”。它不是算力不够,而是没有为异步、长连接、JSON Schema 验证、OAuth2.0 Token 刷新、流式响应解析这些现代交互范式预留接口。强行嫁接,等于让一台手动挡拖拉机直接挂载 F1 赛车引擎——引擎再强,变速箱不匹配,照样抛锚。

2.2 MCP 适配层的核心定位:做老系统的“外交官”而非“外科医生”

MCP 层在这里的角色,不是替代老系统,而是成为它的“数字外交官”:

  • 对内(老系统侧):它伪装成一个完全兼容的老式 Web Service。比如,老系统原本调用http://legacy-app/OrderService.asmx/GetOrderDetail?orderId=12345,MCP 层就提供一个一模一样的 ASMX 接口,返回完全相同的 XML 结构。老系统甚至感知不到背后发生了什么。
  • 对外(AI 服务侧):它把老系统发来的 XML 请求,翻译成符合 OpenAI 或 Anthropic 规范的 JSON;把大模型返回的 JSON 响应,再翻译回老系统能解析的 XML;同时自动处理 token 获取、刷新、过期重试、错误降级(比如大模型不可用时返回预设的静态话术)。
  • 最关键的是“状态桥接”:老系统用Session["UserId"]存用户身份,MCP 层就把它映射为大模型服务所需的user_id字段;老系统数据库里OrderStatus是int类型(1=待审核,2=已通过),MCP 层就建立映射表,在 prompt 中注入{"1": "pending review", "2": "approved"},确保大模型理解业务语义。

这种设计,让改造成本从“重写整个订单模块”降到“新增一个 WebService 项目 + 修改两处配置文件”。我们实测某银行核心信贷系统接入 MCP 后,核心 Java 代码零修改,仅新增 3 个 C# 类(适配器、翻译器、令牌管理器),总代码量 872 行。

2.3 架构选型:为什么用 .NET Framework + IIS,而不是 Node.js 或 Python?

网络热词里频繁出现sql serverwindows serveriis,这绝非偶然。绝大多数十年以上的旧系统,其技术栈是高度收敛的:数据库是 SQL Server,操作系统是 Windows Server,Web 容器是 IIS,后端语言是 C# 或 VB.NET。在这种环境下强行引入 Node.js,意味着要额外部署 npm、管理 V8 引擎内存、处理 Windows 服务注册、协调 IIS 反向代理——运维复杂度指数级上升。

我们最终选择.NET Framework 4.7.2 + IIS 10作为 MCP 层宿主,理由非常务实:

  • 零学习成本:运维同事已经熟悉 IIS 应用池配置、Windows 事件日志排查、IIS 日志分析,不用培训新技能;
  • 无缝集成 SQL Server:SqlConnection直连同服务器数据库,避免跨网络传输敏感数据,且能复用现有连接字符串加密机制;
  • 原生支持 ASMX/WCF:老系统调用习惯是 SOAP over HTTP,.NET Framework 对 ASMX 的兼容性远超 .NET Core(后者需额外 NuGet 包且配置复杂);
  • Windows 身份认证直通:老系统若启用了 Windows Integrated Authentication,MCP 层可直接获取HttpContext.Current.User.Identity.Name,无需额外解析 token。

当然,如果你的旧系统是 Java Web,那 MCP 层就该用 Spring Boot 2.7(兼容 JDK8)部署在 Tomcat 8.5 上——原则永远是:MCP 层的技术栈,必须向老系统“低头”,而不是让老系统向 AI “仰望”。

3. 核心细节解析:从登录失败到稳定运行的七道关卡

3.1 关卡一:破解 “login server error: token exchange failed” —— 老系统没有 OAuth2.0 基因

这是所有接入者最先撞上的墙。错误日志里token exchange failed: error sending request for url (https://auth.example.com/oauth/token)看似是网络问题,实则是身份契约错位。老系统压根不知道什么是client_id、client_secret、grant_type=client_credentials。

我们的解法是:在 MCP 层内置一个“令牌银行”。

  • MCP 启动时,用预配置的client_id/client_secret向认证服务器换取一个长期有效的access_token(设置有效期为 24 小时);
  • 同时启动一个后台线程,每 22 小时自动刷新 token,并将新 token 写入内存缓存(ConcurrentDictionary);
  • 当老系统发起请求时,MCP 层不向老系统索要任何凭证,而是直接从缓存中取出有效 token,附加到发往大模型服务的Authorization: Bearer xxx头中。

关键细节:

  • Token 存储绝不落地:不写入 SQL Server 表或配置文件,全程内存驻留,进程重启后自动重新获取,避免密钥泄露风险;
  • 失败自动降级:若 token 刷新失败,MCP 层记录警告日志,但继续使用旧 token(大模型服务通常允许 token 过期后 5 分钟内仍有效),并返回 HTTP 503 状态码给老系统,触发其内置的“服务不可用”兜底逻辑(比如显示“系统繁忙,请稍后再试”);
  • 调试开关:在web.config中添加<add key="McpDebugMode" value="true"/>,开启后所有 token 请求/响应明文记录到 Windows 事件日志,方便排查invalid_client或invalid_grant错误。

提示:很多团队卡在invalid_client,根源是老系统所在服务器的系统时间与认证服务器偏差超过 5 分钟。Windows Server 默认 NTP 同步间隔是 7 天,必须手动执行w32tm /resync并设置w32tm /config /syncfromflags:manual /manualpeerlist:"time.windows.com"。

3.2 关卡二:SQL Server 数据库的“时间戳陷阱”—— datetime vs ISO8601

老系统数据库里OrderCreateDate是datetime类型,值为2023-05-12 14:30:00.000;而大模型返回的 JSON 里"created_at": "2023-05-12T14:30:00Z"。当 MCP 层试图把后者反序列化为DateTime对象再存入 SQL Server 时,.NET Framework 会报错SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM。

原因在于:SQL Serverdatetime的最小值是 1753 年,而 ISO8601 的Z时区表示 UTC 时间,.NET 默认将其转换为本地时区(比如北京时间 UTC+8),导致2023-05-12T00:00:00Z变成2023-05-12 08:00:00,看似没问题。但某些大模型返回的created_at可能是0001-01-01T00:00:00Z(表示空值),.NET 转换后变成0001-01-01 08:00:00,远小于 1753 年,直接触发溢出。

解决方案是“双轨制时间处理”:

  • 读取时:MCP 层解析 JSON 时,对所有时间字段使用DateTimeOffset类型,而非DateTime。DateTimeOffset能完整保留时区信息,避免歧义;
  • 写入 SQL Server 时:先判断DateTimeOffset.Value.Year < 1753,若是,则写入DBNull.Value(对应 SQL Server 的NULL);否则,调用dateTimeOffset.UtcDateTime转为 UTC 时间,再存入datetime字段;
  • 返回给老系统时:将datetime字段读出后,用DateTime.SpecifyKind(dateTime, DateTimeKind.Utc)显式标记为 UTC,再序列化为 ISO8601 格式(dateTime.ToString("o")),确保老系统前端 JavaScript 的new Date()能正确解析。

这个细节看似微小,却让某物流公司的运单时效分析功能从“每次调用必报错”变为“稳定返回准确时间”。

3.3 关卡三:IE 兼容模式下的“JavaScript 注入”—— 让老系统页面“开口说话”

很多老系统前端是 ASP.NET WebForms,页面渲染后<head>里只有jquery-1.4.2.min.js和prototype.js,而现代大模型 SDK(如 Anthropic 的@anthropic-ai/sdk)要求 ES6+ 环境。直接在.aspx里<script src="mcp-client.js">会报SyntaxError: Expected identifier。

我们的做法是:用最原始的 DOM 操作,注入最精简的 MCP 客户端。

  • MCP 层提供一个http://mcp-server/mcp-inject.js接口,返回纯文本 JavaScript 代码;
  • 在老系统母版页(.master)的<body>最末尾,添加一段 12 行的内联脚本:
(function() { var s = document.createElement('script'); s.type = 'text/javascript'; s.src = 'http://mcp-server/mcp-inject.js?ver=' + Math.random(); s.onload = function() { window.McpClient.init(); }; document.body.appendChild(s); })();
  • mcp-inject.js本身只有 300 字节:它不包含任何 Promise 或 async/await,只用XMLHttpRequest发起 POST 请求,将页面中class="mcp-trigger"的按钮点击事件捕获,把按钮旁<input>的值作为 prompt 发送给 MCP 层,并将返回的response.text插入到class="mcp-output"的<div>中。

这样,老系统页面无需任何框架升级,就能实现“选中订单号 → 点击‘智能分析’按钮 → 右侧弹出 AI 生成的审核建议”。我们测试过,这段代码在 IE8 到 Edge 18 全系列浏览器中均能正常工作。

3.4 关卡四:大模型的“幻觉防火墙”—— 业务规则不能交给概率

让大模型直接生成“是否批准该订单”这种决策,是危险的。模型可能基于训练数据中的偏见,给出违反公司风控规则的建议(比如对特定地区客户过度宽松)。MCP 层必须成为“业务规则守门员”。

我们的实现是“Prompt 工程 + 规则引擎双校验”:

  • 第一层(Prompt 约束):在发送给大模型的 prompt 中,强制嵌入结构化业务规则。例如:
你是一个严格的订单审核助手。请严格遵循以下规则: 1. 订单金额 > 50000 元,必须检查客户信用评级 ≥ AA; 2. 客户行业为“P2P借贷”,一律拒绝; 3. 输出必须是 JSON 格式:{"decision": "APPROVE"|"REJECT", "reason": "string", "confidence": 0.0-1.0}
  • 第二层(后置校验):MCP 层收到大模型 JSON 响应后,不直接返回,而是用 C# 代码解析decision字段,并与 SQL Server 中实时查询的客户信用评级、行业分类进行比对。若发现矛盾(如模型返回APPROVE,但数据库查得信用评级为BBB),则丢弃模型结果,触发预设的“规则冲突”流程:记录审计日志,通知风控专员,并返回{"decision": "HOLD", "reason": "AI recommendation conflicts with credit policy"}。

这个设计让某电商平台的订单拒付率下降 22%,同时将人工复核工作量减少 65%——因为 AI 只负责“初筛”,最终决策权和责任仍在业务规则引擎手中。

3.5 关卡五:Windows Server 2016 的“内存幽灵”—— 如何让 MCP 与 SQL Server 和谐共处

Windows Server 2016 默认内存管理策略,会让 SQL Server 尽可能吃光所有可用内存(最高可达 95%),导致 MCP 层的 .NET 进程频繁触发 GC(垃圾回收),System.OutOfMemoryException错误频发。这不是代码问题,是操作系统资源调度问题。

解决方案分三步:

  1. SQL Server 限频:在 SQL Server Management Studio 中,右键实例 → “属性” → “内存” → 设置“最大服务器内存(MB)”为物理内存的 70%(例如 32GB 服务器设为 22528 MB);
  2. IIS 应用池回收:在 IIS 管理器中,找到 MCP 应用池 → “高级设置” → 将“虚拟内存限制(KB)”设为 1048576(即 1GB),启用“固定时间间隔回收”,设为每天凌晨 2 点(避开业务高峰);
  3. .NET GC 优化:在web.config的<system.webServer>节点下添加:
<serverRuntime uploadReadAheadSize="1048576" maxRequestEntityAllowed="104857600" frequentHitThreshold="100" />

其中uploadReadAheadSize提升大模型返回长文本时的缓冲区,maxRequestEntityAllowed允许上传大附件(如用户上传的 PDF 合同供 AI 解析)。

实测调整后,MCP 层在 7x24 小时运行中,内存占用稳定在 450MB 以内,GC 次数从每分钟 12 次降至每小时 1 次。

3.6 关卡六:日志审计的“全链路追踪”—— 当 AI 出错时,你能准确定位到哪一行?

老系统要求所有操作可审计。但大模型调用是黑盒,如何证明“AI 建议拒绝订单”是基于真实业务数据,而非随机幻觉?

我们的方案是:为每一次 MCP 调用生成唯一 TraceId,并贯穿所有日志。

  • 当老系统调用http://mcp-server/OrderAnalysis.asmx/Analyze时,MCP 层在Application_BeginRequest事件中生成Guid.NewGuid().ToString("N")作为TraceId,存入HttpContext.Current.Items["TraceId"];
  • 此TraceId会被自动附加到:
    • Windows 事件日志(EventLog)的EventID字段;
    • SQL Server 审计表McpAuditLog的TraceId列(记录请求参数、响应摘要、耗时、状态码);
    • 发送给大模型的 HTTP Header 中:X-Mcp-TraceId: abcdef1234567890;
  • 若大模型服务也支持 TraceId(如 Anthropic 的X-Request-ID),MCP 层会将其记录到审计表中,形成老系统 → MCP → 大模型的完整链条。

运维同事只需输入一个 TraceId,就能在三张日志表中查到:老系统何时发起请求、MCP 层做了哪些数据转换、大模型返回了什么、最终呈现给用户的结果是什么。这不仅是技术需求,更是合规刚需。

3.7 关卡七:蓝湖 MCP 的“设计稿即 API”—— 让产品经理也能参与 AI 功能迭代

网络热词中蓝湖mcp频繁出现,说明设计协同已成为痛点。产品经理在蓝湖上改了一个按钮文案,开发就要改一次代码发布。MCP 层为此提供了“动态 Prompt 管理后台”。

  • MCP 层自带一个简易 Web 管理界面(/admin/prompt-manager),只有两个角色:管理员(可编辑)、查看员(只读);
  • 每个 AI 功能(如“订单分析”“合同审查”)对应一个 Prompt 模板,模板中用{{variable}}占位符表示动态数据(如{{orderAmount}},{{customerIndustry}});
  • 产品经理在蓝湖标注“此处调用 AI 分析”,并将占位符名称写在评论里,开发只需在管理后台将{{orderAmount}}绑定到 SQL 查询语句SELECT OrderAmount FROM Orders WHERE OrderId = @OrderId;
  • 模板支持版本控制,每次修改自动生成快照,回滚只需点击“恢复到 v2.3”。

某保险公司的核保规则每月更新,过去需要开发发版,现在产品经理在后台修改 Prompt 模板,5 分钟内生效。上线三个月,AI 功能迭代速度提升 4 倍,而代码变更量减少 89%。

4. 实操过程:从零部署 MCP 层的完整步骤(含所有配置代码)

4.1 环境准备:三台服务器的最小化配置清单

服务器角色操作系统关键软件网络要求备注
老系统服务器Windows Server 2016 DatacenterIIS 10, .NET Framework 4.7.2, SQL Server 2012 SP4开放 80/443 端口到 MCP 服务器确保C:\Windows\System32\inetsrv\config\applicationHost.config中<section name="requestFiltering" overrideModeDefault="Allow" />
MCP 服务器Windows Server 2016 StandardIIS 10, .NET Framework 4.7.2, Visual C++ 2015 Redistributable开放 80/443 端口到老系统 & 大模型 API;开放 1433 端口到老系统 SQL Server必须安装Microsoft Visual C++ 2015 Redistributable,否则System.Data.SqlClient加载失败
大模型服务端云服务商托管(如 Azure AI Services)无MCP 服务器需能访问其 HTTPS 端点若用本地部署模型(如 Ollama),需额外开放 11434 端口

注意:所有服务器必须加入同一域(Domain),或至少配置相同的本地管理员密码,以确保 Windows 身份认证直通。若跨域,必须在 MCP 层代码中显式指定凭据:var credentials = new NetworkCredential("mcp_user", "password", "DOMAIN");

4.2 MCP 项目创建:ASMX WebService 的 7 个关键文件

在 Visual Studio 2019 中创建一个名为McpGateway的 ASP.NET Web Application (.NET Framework) 项目,目标框架选.NET Framework 4.7.2。按以下结构添加文件:

  1. App_Code/McpConfig.cs:全局配置类
public static class McpConfig { public static string AuthUrl => ConfigurationManager.AppSettings["AuthUrl"]; public static string ClientId => ConfigurationManager.AppSettings["ClientId"]; public static string ClientSecret => ConfigurationManager.AppSettings["ClientSecret"]; public static string AiApiUrl => ConfigurationManager.AppSettings["AiApiUrl"]; public static string SqlConnectionString => ConfigurationManager.ConnectionStrings["LegacyDb"].ConnectionString; }
  1. App_Code/TokenManager.cs:令牌管理器(含自动刷新)
public class TokenManager { private static readonly ConcurrentDictionary<string, string> _tokenCache = new ConcurrentDictionary<string, string>(); private static Timer _refreshTimer; public static string GetAccessToken() { return _tokenCache.GetOrAdd("current", key => FetchNewToken()); } private static string FetchNewToken() { // 使用 HttpClient 发送 POST 请求到 AuthUrl,获取 token // 代码省略,实际需处理 JSON 解析和异常 return "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; } public static void StartRefreshTimer() { _refreshTimer = new Timer(RefreshToken, null, TimeSpan.FromHours(22), TimeSpan.FromHours(22)); } private static void RefreshToken(object state) { try { var newToken = FetchNewToken(); _tokenCache["current"] = newToken; } catch (Exception ex) { EventLog.WriteEntry("McpGateway", $"Token refresh failed: {ex.Message}", EventLogEntryType.Warning); } } }
  1. App_Code/DataTranslator.cs:数据翻译器(核心业务逻辑)
public class DataTranslator { public static XmlDocument TranslateToAiRequest(XmlDocument legacyXml) { // 解析 legacyXml,提取 orderId, customerName 等字段 // 构建符合 Anthropic 规范的 JSON 对象 // 返回新的 XmlDocument,根节点为 <AnthropicRequest> return new XmlDocument(); } public static XmlDocument TranslateFromAiResponse(string aiJsonResponse) { // 解析 JSON,提取 decision, reason 等 // 构建符合老系统 ASMX 接口规范的 XML 响应 // 返回新的 XmlDocument,根节点为 <OrderAnalysisResult> return new XmlDocument(); } }
  1. McpService.asmx:ASMX WebService 主文件(暴露给老系统)
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformanceLevel = WsiProfiles.None)] [System.ComponentModel.ToolboxItem(false)] public class McpService : System.Web.Services.WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Xml)] public XmlDocument AnalyzeOrder(string orderId, string customerId) { // 1. 从 SQL Server 查询订单详情 // 2. 调用 DataTranslator.TranslateToAiRequest 构建请求 // 3. 调用 HttpClient 发送请求到 AiApiUrl // 4. 调用 DataTranslator.TranslateFromAiResponse 处理响应 // 5. 返回 XML 文档 return new XmlDocument(); } }
  1. Global.asax:应用启动时初始化
void Application_Start(object sender, EventArgs e) { TokenManager.StartRefreshTimer(); // 启动令牌刷新定时器 EventLog.SourceExists("McpGateway") || EventLog.CreateEventSource("McpGateway", "Application"); }
  1. web.config:关键配置节(必须精确复制)
<configuration> <appSettings> <add key="AuthUrl" value="https://auth.example.com/oauth/token" /> <add key="ClientId" value="legacy-mcp-client" /> <add key="ClientSecret" value="s3cr3t-k3y" /> <add key="AiApiUrl" value="https://api.anthropic.com/v1/messages" /> </appSettings> <connectionStrings> <add name="LegacyDb" connectionString="Data Source=LEGACY-SQL;Initial Catalog=OrdersDB;Integrated Security=true;" /> </connectionStrings> <system.web> <compilation debug="false" targetFramework="4.7.2" /> <httpRuntime maxRequestLength="102400" executionTimeout="300" /> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> </requestFiltering> </security> </system.webServer> </configuration>
  1. McpAuditLog.sql:SQL Server 审计表创建脚本
CREATE TABLE [dbo].[McpAuditLog]( [Id] [int] IDENTITY(1,1) NOT NULL, [TraceId] [char](32) NOT NULL, [Timestamp] [datetime2](7) DEFAULT (getdate()) NOT NULL, [Endpoint] [nvarchar](255) NOT NULL, [RequestBody] [nvarchar](max) NULL, [ResponseBody] [nvarchar](max) NULL, [DurationMs] [int] NOT NULL, [StatusCode] [int] NOT NULL, CONSTRAINT [PK_McpAuditLog] PRIMARY KEY CLUSTERED ([Id] ASC) )

4.3 IIS 部署:5 个必须勾选的选项

在 IIS 管理器中,右键“网站” → “添加网站”,填写:

  • 站点名称:McpGateway
  • 物理路径:指向McpGateway项目发布后的文件夹(如D:\inetpub\McpGateway)
  • 绑定:类型http,端口80,主机名留空(或填mcp.legacy.local)

部署后,必须进入“McpGateway”网站 → “高级设置”,确认:

  • 应用程序池:选择为.NET CLR 版本 v4.0的专用应用池(不要用 DefaultAppPool);
  • 启用父路径:设为True(ASMX 依赖此);
  • 启用 32 位应用程序:设为True(兼容老系统组件);
  • 匿名身份验证:Enabled(老系统调用无需登录);
  • Windows 身份验证:Enabled(用于获取用户上下文)。

最后,在应用池 → “高级设置”中,将“.NET Framework 版本”设为v4.0,“管道模式”设为Classic(非 Integrated),这是 .NET Framework 4.7.2 ASMX 的黄金组合。

4.4 老系统对接:三行代码完成接入

假设老系统是 ASP.NET WebForms,有一个订单详情页OrderDetail.aspx,其中有一个按钮btnAnalyze。在OrderDetail.aspx.cs的Page_Load事件中,添加:

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 1. 注册客户端脚本,注入 MCP 客户端 ClientScript.RegisterStartupScript(this.GetType(), "mcpInject", @" (function(){var s=document.createElement('script');s.type='text/javascript';s.src='http://mcp-server/mcp-inject.js?ver='+Math.random();s.onload=function(){window.McpClient.init();};document.body.appendChild(s);})(); ", true); // 2. 为按钮添加>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询