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错误频发。这不是代码问题,是操作系统资源调度问题。
解决方案分三步:
- SQL Server 限频:在 SQL Server Management Studio 中,右键实例 → “属性” → “内存” → 设置“最大服务器内存(MB)”为物理内存的 70%(例如 32GB 服务器设为 22528 MB);
- IIS 应用池回收:在 IIS 管理器中,找到 MCP 应用池 → “高级设置” → 将“虚拟内存限制(KB)”设为 1048576(即 1GB),启用“固定时间间隔回收”,设为每天凌晨 2 点(避开业务高峰);
- .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;
- Windows 事件日志(EventLog)的
- 若大模型服务也支持 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 Datacenter | IIS 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 Standard | IIS 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。按以下结构添加文件:
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; }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); } } }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(); } }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(); } }Global.asax:应用启动时初始化
void Application_Start(object sender, EventArgs e) { TokenManager.StartRefreshTimer(); // 启动令牌刷新定时器 EventLog.SourceExists("McpGateway") || EventLog.CreateEventSource("McpGateway", "Application"); }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>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. 为按钮添加>