You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Sitefinity 10.x中Swashbuckle无法正常运行的问题

Sitefinity 10.x升级后Swashbuckle 500错误排查方案

我太懂你这种升级后工具突然罢工的烦躁了——之前在7.x里好好跑的Swashbuckle,升到10.x就直接500错误,试了各种版本和配置都没用,确实头大。结合Sitefinity 10.x的框架变化和Swashbuckle的适配要求,给你几个针对性的排查方向:

1. 先锁定Swashbuckle的兼容版本

Sitefinity 10.x基于.NET Framework 4.6.1,并且配套的Web API是Web API 2版本,旧版Swashbuckle(比如针对Web API 1的)肯定会有兼容问题。你需要卸载当前的Swashbuckle包,安装适配Web API 2的稳定版本,比如Swashbuckle 5.6.0

Uninstall-Package Swashbuckle
Install-Package Swashbuckle -Version 5.6.0

这个版本是.NET Framework下Web API 2的经典适配版本,和Sitefinity 10.x的兼容性比较好。

2. 调整Swashbuckle的初始化时机

原来在RegisterRoutes命令里初始化Swashbuckle的时机可能太早了——Sitefinity 10.x的路由注册机制有调整,过早配置会和Sitefinity自身的路由规则冲突。建议把初始化逻辑移到Bootstrapped事件(所有Sitefinity核心组件初始化完成后),并且用Web API 2推荐的GlobalConfiguration.Configure包裹配置:

protected void Application_Start(object sender, EventArgs e) 
{ 
    Bootstrapper.Initialized += Bootstrapper_Initialized; 
} 

private void Bootstrapper_Initialized(object sender, ExecutedEventArgs args) 
{ 
    RouteTable.Routes.Ignore("ipad"); 
    // 换成Bootstrapped事件,确保Sitefinity核心初始化完成
    if (args.CommandName == "Bootstrapped") { 
        GlobalConfiguration.Configure(config => {
            // 先注册Web API基础路由
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // 再添加你的自定义过滤器和序列化配置
            config.Filters.Add(new LoggingFilterAttribute()); 
            config.Services.Replace(typeof(IHttpActionInvoker), new ControllerActionInvoker()); 
            config.Filters.Add(new ApiExceptionFilterAttribute()); 
            JsonDefaultSerializer.ConfigureApi(config); 

            // 最后初始化Swashbuckle
            config.EnableSwagger(c => { 
                c.SingleApiVersion("v1", "xxx.Web"); 
                c.DocumentFilter<SwaggerCustomControllersFilter>(); 
                c.IgnoreObsoleteActions(); 
                c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); 
            }) 
            .EnableSwaggerUi(c => { 
                c.DisableValidator(); 
            }); 
        });
    } 
}

这个调整能避免路由注册顺序导致的冲突,是解决这类问题的常见手段。

3. 修复Newtonsoft.Json版本冲突

Sitefinity 10.x自带了特定版本的Newtonsoft.Json(通常是10.0.3左右),如果Swashbuckle依赖的Json版本和它不一致,就会出现序列化错误。你可以:

  • 打开NuGet包管理器,统一项目中Newtonsoft.Json的版本为Sitefinity自带的版本;
  • 如果无法统一,在web.config中添加版本绑定重定向,强制所有组件使用Sitefinity的版本:
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="10.0.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

注意newVersion要和你Sitefinity bin目录里的Newtonsoft.Json.dll版本一致。

4. 排除Sitefinity安全/路由拦截

升级后,Sitefinity的URL重写或安全模块可能会拦截Swagger的请求(默认路径是/swagger)。你可以:

  • 登录Sitefinity后台,进入Settings -> Advanced -> System -> Web -> URL重写,添加一条忽略规则,忽略以/swagger开头的路径;
  • 检查应用程序池的身份权限,确保它能访问项目的bin目录和Swashbuckle生成的临时文件。

5. 先抓详细错误信息!

现在你没有完整的错误提示,很难精准定位问题。建议先开启详细错误日志:
在web.config中修改以下配置:

<system.web>
    <customErrors mode="Off" />
</system.web>
<system.webServer>
    <httpErrors errorMode="Detailed" />
</system.webServer>

之后访问/swagger就能看到完整的500错误堆栈信息,比如是反射失败、路由冲突还是序列化异常,这能帮你直接锁定问题根源。

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

火山引擎 最新活动