Silky微服务框架在线文档Silky微服务框架在线文档
首页
文档
配置
源码解析
博文
github
gitee
首页
文档
配置
源码解析
博文
github
gitee
  • 简介

    • silky 框架介绍
  • 入门

    • 名词解释
    • 快速开始
    • 脚手架
    • 微服务模块化架构的最佳实践 & 约定
    • 示例
  • 主机与模块

    • 主机
    • 网关
    • 模块
    • 插件
  • 网关与 HTTP

    • Swagger 文档
    • 性能分析(MiniProfiler)
    • 跨域(CORS)
    • 审计日志
  • 服务与 RPC

    • 应用服务和服务条目
    • rpc通信
    • websocket通信
    •  服务注册中心
    • 服务治理
  • 数据与缓存

    • EFCore 数据访问
    • 缓存
    • 分布式锁
  • 安全与认证

    • 身份认证与授权
    • 分布式事务
  • 基础设施

    • 依赖注入
    • 对象到对象的映射
    • 参数验证
    • 链路跟踪
    • 日志(Serilog)
    • 健康检查
    • 消息总线(MassTransit)
    • 单元测试与集成测试

概述

在微服务架构中,前端应用与网关往往部署在不同域名下,需要配置**跨域资源共享(CORS)**才能正常访问。silky 框架通过 Silky.Http.CorsAccessor 模块对 CORS 进行统一管理,只需配置 YAML 文件即可完成跨域设置,无需手动编写中间件代码。

说明

CORS 配置仅对网关(Silky.Agent.Host)和Web 主机类型有效,通用主机(General Host)不提供 HTTP 服务,不需要配置 CORS。

启用 CORS

Silky.Http.CorsAccessor 模块已内置在 Silky.Agent.Host 中,默认自动启用,无需额外安装包或手动注册中间件。

如果是自定义主机,需要在 Startup.cs 中手动注册:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSilkyHttpCore()
        .AddCorsAccessor();   // 注册跨域服务
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseCorsAccessor();    // 启用跨域中间件(必须在 UseRouting 之前)
    app.UseRouting();
    // ...
}

配置项说明

跨域配置通过 CorsAccessor 配置节点进行设置,对应类型为 CorsAccessorOptions:

配置项类型默认值说明
policyNamestringApp.CorsAccessor.Policy跨域策略名称
withOriginsstring[][](允许所有来源)允许的来源域名列表,空数组表示允许所有来源
withHeadersstring[]null(允许所有请求头)允许的请求头列表
withExposedHeadersstring[]null响应时暴露给前端的响应头
withMethodsstring[]null(允许所有请求方法)允许的 HTTP 请求方法列表
allowCredentialsbooltrue是否允许跨域请求携带凭据(Cookie 等)
setPreflightMaxAgeint?null预检请求(OPTIONS)结果的缓存时间(秒)

配置示例

允许所有来源(开发环境)

允许任意来源访问,适用于开发和测试阶段:

CorsAccessor:
  # withOrigins 为空时,允许所有来源,但无法同时设置 allowCredentials: true
  allowCredentials: false

注意

当 withOrigins 为空(允许所有来源)时,allowCredentials 必须设置为 false。这是浏览器安全规范的限制:Access-Control-Allow-Origin: * 不能与 Access-Control-Allow-Credentials: true 同时使用。

指定来源(生产环境推荐)

CorsAccessor:
  withOrigins:
    - https://www.example.com
    - https://admin.example.com
  allowCredentials: true
  setPreflightMaxAge: 600  # 预检结果缓存 600 秒

精细化配置

CorsAccessor:
  withOrigins:
    - https://app.example.com
  withHeaders:
    - Content-Type
    - Authorization
    - X-Requested-With
  withExposedHeaders:
    - X-Pagination
    - X-Total-Count
  withMethods:
    - GET
    - POST
    - PUT
    - PATCH
    - DELETE
  allowCredentials: true
  setPreflightMaxAge: 3600

允许所有子域名

withOrigins 支持通配符子域名(使用 * 匹配):

CorsAccessor:
  withOrigins:
    - https://*.example.com   # 允许所有 example.com 子域名
  allowCredentials: true

配置节点位置

CORS 配置节点名称为 CorsAccessor(区分大小写),可放置在 appsettings.yaml 或独立配置文件中:

# appsettings.yaml(网关应用)
rpc:
  token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW

registryCenter:
  type: Consul
  connectionStrings: http://127.0.0.1:8500

CorsAccessor:
  withOrigins:
    - https://app.example.com
  allowCredentials: true

高级用法:自定义策略

如果需要完全自定义 CORS 策略,可以在 AddCorsAccessor() 调用时传入委托:

services.AddCorsAccessor(
    corsOptionsHandler: options =>
    {
        // 添加额外的命名策略
        options.AddPolicy("StrictPolicy", builder =>
        {
            builder.WithOrigins("https://trusted.example.com")
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        });
    },
    corsPolicyBuilderHandler: builder =>
    {
        // 在默认策略基础上追加自定义设置
        builder.SetIsOriginAllowed(origin => true);
    }
);
编辑当前页
Prev
性能分析(MiniProfiler)
Next
审计日志