基于 .NET 与 Aspire 构建 Streamable HTTP 远程 MCP 服务器:从本地 stdio 到 Azure 云端部署
教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载本文以 mcp-for-beginners 开源课程中04-PracticalImplementation/samples/csharp的 C# 示例为核心系统讲解如何将 MCP 服务器从本地stdio传输升级为面向云端场景的Streamable HTTP传输并完整演示本地启动Aspire 编排、MCP Inspector 联调、GitHub Copilot Chat 集成以及azd up一键部署到 Azure 的全流程。读完本文你将掌握基于ModelContextProtocol.AspNetCore构建远程 HTTP MCP 服务器的代码结构、配置要点与生产化部署路径。为什么需要从 stdio 走向 Streamable HTTP在课程前一章05-stdio-server中我们构建的是一个本地 .NET MCP 服务器通过stdio传输类型运行在容器中。stdio模型下客户端以子进程方式启动服务器通过标准输入输出交换 JSON-RPC 消息简单、安全、易于调试非常适合本地与 CLI 工具场景。但在很多真实场景中我们希望服务器运行在远端——例如云环境中让多个客户端、多个用户通过网络访问同一个 MCP 服务。此时就需要http传输类型。按当前 MCP 规范标准传输机制有两类传输类型状态通知能力典型用途stdio现行支持本地子进程Streamable HTTP现行支持远程与云端服务器说明MCP 2025-06-18 规范起独立 SSE 传输已被废弃由Streamable HTTP取代MCP 2026-07-28 规范进一步将请求收敛为自包含的 POST 请求携带MCP-Protocol-Version与Mcp-Method头。本示例正是基于这套新的 HTTP 传输模型。相关背景可参阅 06-http-streaming 章节。本示例对应英文原文档位于 04-PracticalImplementation/samples/csharp/README.md完整解决方案包含三个 .NET 项目组织在 Calculator.sln 中。解决方案结构总览三个项目的分工初看04-PracticalImplementation下的解决方案会觉得比之前的 stdio 示例复杂但实际并非如此。解决方案根目录04-PracticalImplementation/samples/csharp包含三个项目src/Calculator真正的 MCP 服务器。它和上一个示例的代码几乎完全一致唯一区别是换用了ModelContextProtocol.AspNetCore库来处理 HTTP 请求并把IsPrime方法改为private用于演示服务器代码中完全可以保留私有辅助方法。src/AppHost来自 Aspire 的编排宿主orchestrator负责启动与编排 Calculator 资源。src/ServiceDefaultsAspire 共享项目集中配置 OpenTelemetry、健康检查、服务发现与弹性resilience。Aspire 的作用是提升开发与测试阶段的开发者体验并提供可观测性支持。它不是运行服务器的必要条件但将其纳入解决方案是一种良好实践。核心源码解析Calculator 项目如何提供 HTTP 传输入口 Program.cssrc/Calculator/Program.cs 是理解整个示例的关键全文如下using Calculator.Tools; var builder WebApplication.CreateBuilder(args); builder.Logging.AddConsole(consoleLogOptions { // Configure all logs to go to stderr consoleLogOptions.LogToStandardErrorThreshold LogLevel.Trace; }); builder.Services .AddMcpServer() .WithHttpTransport(o o.Stateless true) .WithToolsCalculatorTool(); builder.AddServiceDefaults(); var app builder.Build(); app.MapDefaultEndpoints(); app.MapMcp(/mcp); app.Run();逐行拆解builder.Logging.AddConsole(...)将日志统一输出到stderrLogToStandardErrorThreshold LogLevel.Trace。对 HTTP 服务器而言stdout不再承担协议通信职责但保持此配置仍能避免日志污染任何协议输出流。AddMcpServer()注册 MCP 服务器核心服务。.WithHttpTransport(o o.Stateless true)启用 HTTPStreamable HTTP传输。Stateless true表明服务器为无状态模式——这是与旧版Mcp-Session-Id会话模型的显著区别符合 2026-07-28 规范下自包含 POST 请求的模型。.WithToolsCalculatorTool()自动发现并注册CalculatorTool类型中所有带[McpServerTool]特性的方法。builder.AddServiceDefaults()来自 ServiceDefaults 项目接入 Aspire 默认的 OpenTelemetry、健康检查、服务发现与弹性配置。app.MapMcp(/mcp)将 MCP 端点映射到/mcp路径。这就是文档中要求客户端 URL 拼接/mcp的原因。项目文件 src/Calculator/Calculator.csproj 以net9.0为目标框架核心依赖为PackageReference IncludeModelContextProtocol.AspNetCore Version0.*-* /注意该 C# MCP SDK 目前处于预览阶段previewAPI 可能随版本演进而变化0.*-*通配版本号用于始终解析到最新的 0.x 预览版。工具实现 CalculatorTool.cssrc/Calculator/Tools/CalculatorTool.cs 通过[McpServerToolType]声明工具类型内部包含 5 个[McpServerTool]工具工具方法说明关键行为Add计算两数之和返回numberA numberBSubtract计算两数之差返回numberA - numberBMultiply计算两数之积返回numberA * numberBDivide计算两数之商除数为 0 时抛出ArgumentException(Cannot divide by zero)NextFivePrimeNumbers返回给定数之后的下 5 个质数内部调用私有静态方法IsPrime其中NextFivePrimeNumbers是验证客户端LLM工具调用行为的关键工具[McpServerTool, Description(Finds the next 5 prime numbers after the given number)] public Listlong NextFivePrimeNumbers(long startNumber) { var result new Listlong(5); long number startNumber; while (result.Count 5) { number; if (IsPrime(number)) { result.Add(number); } } return result; } // Helper method to efficiently check if a number is prime private static bool IsPrime(long number) { if (number 1) return false; if (number 3) return true; if (number % 2 0 || number % 3 0) return false; // Check divisibility using the 6k±1 optimization for (long i 5; i * i number; i 6) { if (number % i 0 || number % (i 2) 0) { return false; } } return true; }IsPrime被刻意声明为private static演示 MCP 服务器代码中允许存在私有辅助方法——只有带[McpServerTool]特性的公开方法才会被暴露为 MCP 工具其余成员完全封装在服务器内部。AppHostAspire 编排宿主src/AppHost/Program.cs 定义了 Aspire 编排逻辑var builder DistributedApplication.CreateBuilder(args); builder.AddProjectProjects.Calculator(calc-mcp) .WithExternalHttpEndpoints(); builder.Build().Run();资源命名为calc-mcp与后续.vscode/mcp.json中服务器名称一致。.WithExternalHttpEndpoints()标记该资源需要对外暴露 HTTP 端点这也是azd up部署到 Azure Container Apps 时能够生成外部 URL 的前提。宿主项目 src/AppHost/AppHost.csproj 使用Aspire.AppHost.Sdk版本 9.3.1与Aspire.Hosting.AppHost9.*。ServiceDefaults可观测性与弹性底座src/ServiceDefaults/Extensions.cs 集中提供了ConfigureOpenTelemetry()接入 OpenTelemetry 的日志、指标AspNetCore/HttpClient/Runtime仪表与链路追踪并按需启用 OTLP 导出器。AddDefaultHealthChecks()注册名为self的存活探针开发环境下通过MapDefaultEndpoints()暴露/health与/alive端点。服务发现AddServiceDiscovery与默认 HTTP 弹性处理器AddStandardResilienceHandler。本地启动服务器并记录 HTTP URL前置条件VS Code 安装 C# DevKit 扩展。然后在 VS Code 中导航到04-PracticalImplementation/samples/csharp目录。执行以下命令启动服务器dotnet watch run --project ./src/AppHost浏览器会自动打开Aspire Dashboard在其中找到calc-mcp资源的httpURL——形如http://localhost:5058/。注意AppHost的 launchSettings.json 定义了https与http两个启动配置dashboard 自身端口分别为17228/15047而运行时 Calculator 资源的对外端口由 Aspire 动态分配因此请以 Dashboard 中实际显示的 URL 为准。dotnet watch提供热重载能力修改 Calculator 代码后服务器自动重启极大提升本地迭代效率。用 MCP Inspector 测试 Streamable HTTP 传输当服务器正在运行时打开一个新的终端执行npx modelcontextprotocol/inspector http://localhost:5058前置条件本机已安装 Node.js 22.7.5 或更高版本MCP Inspector 基于 Node.js 运行。在 Inspector 界面中完成连接配置Transport type选择Streamable HTTP。在Url字段填入之前记录的服务器 URL并追加/mcp——即http://localhost:5058/mcp。注意这里必须是http而非https因为本地开发服务器未启用 TLS。点击Connect按钮。Inspector 的一大优点是提供对当前连接与消息交互的完整可见性。连接成功后尝试List Tools应能看到Add、Subtract、Multiply、Divide、NextFivePrimeNumbers五个工具及其描述。逐个调用这些工具行为应与上一章 stdio 示例完全一致。在 VS Code 中用 GitHub Copilot Chat 消费 HTTP 服务器要在 GitHub Copilot Chat 中使用 Streamable HTTP 传输需要把上一章为calc-mcp服务器创建的配置改为如下形式配置文件位于工作区.vscode/mcp.json// .vscode/mcp.json { servers: { calc-mcp: { type: http, url: http://localhost:5058/mcp } } }与 stdio 配置的本质区别type从stdio变为http并直接提供urlstdio 则需要command/args。这是 MCP 客户端接入远程 HTTP 服务器的标准声明方式。完成配置后在 Copilot Chat 中尝试以下提示词观察 LLM 如何自主调用工具「3 prime numbers after 6780」观察 Copilot 如何调用新工具NextFivePrimeNumbers并只返回前 3 个质数工具本身返回 5 个模型应从中截取 3 个。「7 prime numbers after 111」观察当所需数量7 个超过工具单次返回上限5 个时会发生什么——这是测试模型推理与工具边界的好案例。「John has 24 lollies and wants to distribute them all to his 3 kids. How many lollies does each kid have?」观察模型是否会选择Divide工具24 ÷ 3 8来求解验证算术类工具在自然语言推理中的调用链路。这三类提示词分别验证了工具选择、结果截取/数量协商与多步推理能力是检验 MCP 工具与 LLM 协作质量的有效手段。将服务器部署到 Azure让更多用户能够访问服务器需要将其部署到云端。本示例使用 Azure Developer CLIazd一键部署到Azure Container Apps。在终端中导航到04-PracticalImplementation/samples/csharp目录然后执行azd up部署配置由根目录的 azure.yaml 驱动# yaml-language-server: $schemahttps://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json name: mcp-calculator services: app: language: dotnet project: ./src/AppHost/AppHost.csproj host: containerapp关键配置项name应用名称mcp-calculator。services.app.project指向AppHost.csproj即由 Aspire 编排宿主整体上云。services.app.hostcontainerapp表示部署目标为 Azure Container Apps无服务器容器平台。部署完成后终端会显示类似如下的成功信息此时 Azure Container Apps 会为服务分配一个公网 HTTPS URL形如https://calc-mcp.gentleriver-3977fbcf.australiaeast.azurecontainerapps.io。复制该 URL分别用于1. MCP Inspector将 Transport type 设为Streamable HTTPURL 填入https://你的域名/mcp点击 Connect。2. GitHub Copilot Chat更新.vscode/mcp.json为云端地址// .vscode/mcp.json { servers: { calc-mcp: { type: http, url: https://calc-mcp.gentleriver-3977fbcf.australiaeast.azurecontainerapps.io/mcp } } }提示上例 URL 仅为演示占位实际部署后请以azd up输出的真实 URL 为准。云端地址使用https与本地http形成对比——TLS 由 Azure Container Apps 自动终结。下一步私有资源的访问安全本章完成了传输类型的横向对比stdio vs Streamable HTTP、两种测试工具MCP Inspector 与 GitHub Copilot Chat的联调以及服务器在 Azure 上的云端部署。但还有一个关键问题悬而未决如果服务器需要访问私有资源——例如数据库或私有 API该怎么办这正是下一章的主题通过安全机制提升服务器的访问控制能力。可先参阅 02-Security 目录 中的安全最佳实践文档预热相关概念。小结ModelContextProtocol.AspNetCore通过WithHttpTransport()与MapMcp(/mcp)将既有 MCP 服务器无缝升级为 Streamable HTTP 传输业务代码几乎零改动见 Program.cs。AspireAppHost ServiceDefaults为本地开发提供仪表盘、可观测性与一键上云能力是生产级 MCP 解决方案的推荐组合。MCP Inspector 与.vscode/mcp.jsontype: httpurl分别覆盖协议级联调与 IDE 集成两种消费方式。azd up azure.yaml 可将整套解决方案部署到 Azure Container Apps获得公网 HTTPS 端点。赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐使用 .NET 构建 Streamable HTTP 传输的 MCP 服务器从本地 Aspire 开发到 Azure 云端部署使用 .NET 构建 Streamable HTTP 传输的 MCP 服务器从本地 Aspire 开发到 Azure 云端部署 导读 本文基于 mcp for教程文档人工智能MCP 实战使用 .NET、Aspire 与 Streamable HTTP 构建远程 MCP 服务器并部署到 AzureMCP 实战使用 .NET、Aspire 与 Streamable HTTP 构建远程 MCP 服务器并部署到 Azure 本篇指南基于 mcp for be教程文档人工智能在 .NET 中构建 Streamable HTTP 传输的 MCP 服务器从本地 Aspire 编排到 Azure 云部署实战在 .NET 中构建 Streamable HTTP 传输的 MCP 服务器从本地 Aspire 编排到 Azure 云部署实战 本指南基于 mcp for教程文档人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

大模型应用落地指南:从RAG到Agent的企业AI转型实战

大模型应用落地指南:从RAG到Agent的企业AI转型实战

简介:面向企业管理者、技术负责人及人工智能从业者的《火山引擎大模型应用落地白皮书》,系统梳理大模型从探索走向业务深度融合的现状,剖析企业在落地中普遍面临的高成本、选型困难、部署复杂与安全风险等挑战,并提出分阶段构建业…

2026/10/11 19:14:19 阅读更多 →
微博评论爬虫实战:登录协议解析与热评增量抓取

微博评论爬虫实战:登录协议解析与热评增量抓取

简介:本资源是一份面向Python初学者与爬虫入门者的实战教程,手把手讲解如何抓取微博平台的评论数据,解决社交媒体舆情分析、粉丝行为研究等实际场景中的数据采集需求。内容涵盖登录模拟(含RSA加密、预登陆参数获取、验证码处理&am…

2026/10/11 19:14:19 阅读更多 →
自动化测试实战:从Selenium到AI辅助的工程化进阶指南

自动化测试实战:从Selenium到AI辅助的工程化进阶指南

搞了快十年自动化测试,从最初只会用Selenium录制回放,到现在带团队搭框架、写平台,期间踩过的坑比写过的用例还多。经常有人问我自动化测试到底该怎么学、怎么落地,说实话这问题太大,但有一个很直接的感受:…

2026/10/11 19:13:18 阅读更多 →

最新新闻

短线交易生存指南:模式内交易、仓位管理与止损铁律

短线交易生存指南:模式内交易、仓位管理与止损铁律

我不确定各位做短线交易多久了,但如果你在交易社区里泡过一阵,应该会发现一个特别直观的现象:晒收益截图的人换了一茬又一茬,今天还在涨停板上来回横跳的那位,第二年基本就没了声音。短线交易之所以是淘汰率最高的领域…

2026/10/12 6:25:44 阅读更多 →
Mongoose入门教程:用TaoToken统一Key打通Node.js与MongoDB开发链路

Mongoose入门教程:用TaoToken统一Key打通Node.js与MongoDB开发链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:25:44 阅读更多 →
傅里叶算子结合SVM的手势识别源码详解与调参实战

傅里叶算子结合SVM的手势识别源码详解与调参实战

简介:面向手势识别与计算机视觉学习场景,这份完整源代码基于Python实现,并附带已构建好的样本库,适合机器学习初学者、课程设计或毕业设计者借鉴。代码运行于Win10 Python3.7环境,完整覆盖图像平滑、OTSU阈值肤色分割…

2026/10/12 6:25:44 阅读更多 →
CAMStoWRF完全指南:从CAMS数据下载到WRF-Chem初边界场配置

CAMStoWRF完全指南:从CAMS数据下载到WRF-Chem初边界场配置

做空气质量模拟的人应该都干过这件事:把全球化学模式的输出结果塞进WRF-Chem里当初始场和边界场。早些年大家满世界找MOZART的nc文件,后来慢慢有人开始用CAMS(哥白尼大气监测服务)的再分析数据。CAMS数据覆盖面广、化学物种相对齐…

2026/10/12 6:25:44 阅读更多 →
多角色管理与押金自动退:一站式租赁商城小程序源码系统解析

多角色管理与押金自动退:一站式租赁商城小程序源码系统解析

做租赁类小程序这几年,我见过太多项目死在同一个坑里:商品、支付都接好了,结果押金体系没设计好,客人退押金要催、商家扣款要吵、平台两边受气。今天聊的这套“多角色管理、押金自动退的一站式线上租赁商城小程序源码系统”&#…

2026/10/12 6:25:44 阅读更多 →
开源+私有化:打造能主动干活的企业AI工作伙伴

开源+私有化:打造能主动干活的企业AI工作伙伴

1. 从"只会聊天"到"能干活":企业AI落地的真实断层在哪过去两年,我参与过好几个企业内部的AI助手项目,几乎每一个都经历过同样的尴尬:上线第一周大家图新鲜,问天气、写周报、翻译邮件,用…

2026/10/12 6:24:44 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →