像asp.net core webapi一样在asp.net frameworks中使用Swagger,方便调试接口

用asp.net core 开发webapi,默认在开发环境有一个Swagger页面,可以让开发者直接在浏览器下测试接口,而我们早在.net framewokrs时,用一般处理程序来充当接口,现在我们也让他在开发环境有一个Swagger页面,如此就能像在core框架下方便调试接口了。为最简单地说明问题,我们代码尽量简化。

第一步,建立一个空的asp.net frameworks空网站,添加一个一般处理程序,此处取名为DemoHandler.ashx,"随便"编写一些简单代码,比如

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SwaggerForAshx
{
    /// <summary>
    /// DemoHandler 的摘要说明
    /// </summary>
    public class DemoHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            // 设置响应格式为纯文本
            context.Response.ContentType = "text/plain";

            // 区分 GET/POST 请求
            if (context.Request.HttpMethod.Equals("GET", System.StringComparison.OrdinalIgnoreCase))
            {
                // GET 请求:默认输出 Hello World
                context.Response.Write("Hello World");
            }
            else if (context.Request.HttpMethod.Equals("POST", System.StringComparison.OrdinalIgnoreCase))
            {
                // POST 请求:接收 name 参数,输出 你好,XX
                string userName = context.Request.Form["name"] ?? "";

                if (!string.IsNullOrEmpty(userName))
                {
                    context.Response.Write($"你好,{userName}");
                }
                else
                {
                    context.Response.StatusCode = 405;
                    context.Response.Write("缺少参数");
                }
               
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

第二步,然后通过nuget下载安装Swashbuckle,安装完成后我们看到,项目中多了一个Swashbuckle.cs的配置文件(未修改前代码略),修改Swashbuckle,代码如下

csharp 复制代码
using SwaggerForAshx;
using Swashbuckle.Application;
using Swashbuckle.Swagger;
using System.Collections.Generic;
using System.Linq;
using System.Web.Configuration;
using System.Web.Http;
using WebActivatorEx;

[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace SwaggerForAshx
{
    public class SwaggerConfig
    {

        public static void Register()
        {
            bool isDebuggingEnabled = WebConfigurationManager
            .GetWebApplicationSection("system.web/compilation") // 定位到compilation节点
            is CompilationSection compilationSection
            && compilationSection.Debug; // 读取Debug属性(true/false)
            //--
            if (isDebuggingEnabled) //仅在开发环境下才能使用Swagger
            {
                GlobalConfiguration.Configuration
               .EnableSwagger(c =>
               {
                   c.SingleApiVersion("v1", "ASHX 调用测试");
                   c.ResolveConflictingActions(api => api.First());

                   // 核心:5.6.0 专属------自定义文档提供器,手动添加 ashx 接口
                   c.CustomProvider((defaultProvider) =>
                       new CustomSwaggerProvider(defaultProvider));
               })
               .EnableSwaggerUi(c =>
               {
                   c.DocumentTitle("ASHX 调用测试专用页面");
               });
            }
           
        }

        public class CustomSwaggerProvider : ISwaggerProvider
        {
            private readonly ISwaggerProvider _defaultProvider;

            public CustomSwaggerProvider(ISwaggerProvider defaultProvider)
            {
                _defaultProvider = defaultProvider;
            }

            // 重写 GetSwagger 方法,手动添加 ashx 接口
            public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
            {
                // 获取默认 Swagger 文档
                var swaggerDoc = _defaultProvider.GetSwagger(rootUrl, apiVersion);


                swaggerDoc.paths["/DemoHandler.ashx"] = new PathItem
                {
                    // 指定 HTTP 方法为 GET
                    get = new Operation
                    {
                        tags = new List<string> { "测试接口" }, // 接口分类
                        summary = "默认get输出", // 接口说明
                        responses = new Dictionary<string, Response>
                        {
                            // 响应状态码和说明
                            ["200"] = new Response { description = "返回 Hello World 字符串" }
                        }
                    },
                    post = new Operation
                    {
                        tags = new List<string> { "测试接口" },
                        summary = "输出 你好,XX(POST)",
                        // 声明 POST 参数(表单方式传参,适配 Swagger 测试)
                        parameters = new List<Parameter>
        {
            new Parameter
            {
                name = "name", // 参数名
                @in = "formData", // 参数位置:表单(Swagger 里能直接输入)
                description = "要问候的用户名",
                required = true, // 必传
                type = "string" // 参数类型
            }
        },
                        responses = new Dictionary<string, Response>
                        {
                            ["200"] = new Response { description = "返回 你好,XX" },
                            ["400"] = new Response { description = "参数缺失或错误" },
                            ["405"] = new Response { description = "仅支持 GET 请求" },
                            ["500"] = new Response { description = "服务器内部错误" }
                        }
                    }
                };

                //---

                return swaggerDoc;
            }
        }
    }
}

代码完成,启动调试运行,在地址栏域名后加上swagger,比如https://localhost:[你的端口号]/swagger。完工

相关推荐
百万蹄蹄向前冲3 小时前
支付宝 VS 微信 小程序差异
前端·后端·微信小程序
凤山老林10 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
清汤饺子10 小时前
用 Cursor 半年了,效率还是没提升?是因为你没用对这 7 个功能
前端·后端·cursor
雨夜之寂10 小时前
Browser Use + DeepSeek,我踩了哪些坑
后端·面试
wefly201711 小时前
开发者效率神器!jsontop.cn一站式工具集,覆盖开发全流程高频需求
前端·后端·python·django·flask·前端开发工具·后端开发工具
dreamread11 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
把你毕设抢过来11 小时前
基于Spring Boot的社区智慧养老监护管理平台(源码+文档)
数据库·spring boot·后端
一直都在57211 小时前
Spring面经
java·后端·spring
XPoet12 小时前
AI 编程工程化:Command——给你的 AI 员工编一套操作手册
前端·后端·ai编程
jgyzl12 小时前
2026.3.12 常见的缓存读写策略
java·后端·spring