基于 .NET 与 Aspire 构建 Streamable HTTP 远程 MCP 服务器:从本地 stdio 到 Azure 云端部署

发布时间:2026/10/11 19:14:19
基于 .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),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询