You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core MVC中为特定Action/Controller启用HTTP连接?

解决方案:为特定Action/Controller允许HTTP请求(ASP.NET Core 2.1)

嘿,这个场景我之前也碰到过——全局强制HTTPS但第三方只能发HTTP请求还不支持重定向,给你几个简单可行的方案,适配ASP.NET Core 2.1:

方案1:中间件条件跳过HTTPS重定向(快速实现)

这个方法不需要改动太多现有配置,只需要在HTTPS重定向中间件前加一段逻辑,判断请求路径是否属于允许HTTP的API,是的话直接放行。

在Configure方法里调整中间件顺序:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 先添加自定义判断逻辑,跳过指定路径的HTTPS重定向
    app.Use(async (context, next) =>
    {
        // 替换成你需要允许HTTP的Controller/Action路径,支持前缀匹配
        var allowedHttpPaths = new List<string> { "/api/third-party-webhook", "/api/external-callback" };
        
        if (allowedHttpPaths.Any(path => context.Request.Path.StartsWithSegments(path)))
        {
            // 直接放行,不触发HTTPS重定向
            await next();
            return;
        }
        
        // 其他请求继续走HTTPS重定向流程
        await next();
    });

    // 保留你原有的HTTPS重定向配置
    app.UseHttpsRedirection();

    // 其他中间件(比如Mvc)继续保留
    app.UseMvc();
}

方案2:特性标记+MVC过滤器(更优雅的细粒度控制)

如果希望用特性标记的方式灵活指定哪些Controller/Action允许HTTP,可以改用MVC的RequireHttpsAttribute全局过滤器,配合自定义的跳过特性。

步骤1:创建允许HTTP的特性

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AllowHttpAttribute : Attribute
{
    // 标记用,无额外逻辑
}

步骤2:配置MVC全局过滤器

修改ConfigureServices,移除原有的AddHttpsRedirection配置,改用MVC的全局强制HTTPS过滤器,同时添加自定义过滤器来跳过标记了AllowHttp的Action:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        // 全局强制HTTPS
        options.Filters.Add(new RequireHttpsAttribute());
        // 添加自定义过滤器,跳过标记AllowHttp的请求
        options.Filters.Add(new AllowHttpFilter());
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

// 自定义过滤器:移除标记了AllowHttp的请求的HTTPS要求
public class AllowHttpFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // 检查当前Action/Controller是否有AllowHttp特性
        var isAllowHttp = context.ActionDescriptor.EndpointMetadata.Any(meta => meta is AllowHttpAttribute);
        
        if (isAllowHttp)
        {
            // 移除RequireHttps过滤器,允许HTTP请求
            context.Filters.RemoveAll<RequireHttpsAttribute>();
        }
    }
}

步骤3:给目标Controller/Action添加特性

// 整个Controller都允许HTTP
[AllowHttp]
[Route("api/third-party")]
public class ThirdPartyApiController : Controller
{
    [HttpPost]
    public IActionResult ReceiveData([FromBody] ExternalRequestModel model)
    {
        // 处理第三方请求
        return Ok(new { Status = "Success" });
    }
}

// 或者单个Action允许HTTP
[Route("api/callbacks")]
public class CallbackController : Controller
{
    [AllowHttp]
    [HttpPost("external")]
    public IActionResult ExternalCallback([FromForm] CallbackData data)
    {
        // 处理回调
        return Accepted();
    }
}

注意事项

  • 方案1的中间件顺序很重要:判断逻辑必须放在UseHttpsRedirection之前,否则重定向已经触发了。
  • 方案2需要移除app.UseHttpsRedirection()中间件,因为MVC的过滤器已经处理了HTTPS强制,避免重复重定向。
  • 尽量缩小允许HTTP的路径范围,避免安全风险——只给必须的第三方API开放HTTP访问。

内容的提问来源于stack exchange,提问作者Rico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:18:14