Kentico v8.2.12:为什么我的 WebAPI 路由没有正确注册(通常只在第一个版本上)?

Kentico v8.2.12: Why is my WebAPI Route not registered correctly (usually only on the first release)?

总结

我最近实现了 Web API 服务的 Kentico 8.2 网站在第一次部署和所有调用时都没有注册路由 return 404。进一步的重新部署通常可以解决这个问题,但我想在发布到 PROD 之前永久修复它。

是什么阻止了第一个部署正确注册路由?

背景

我们有一个 Kentico v8.2.12 网站,该网站使用使用 .NET Framework v4 的 Web 窗体。我已经注册了一个 Web API 控制器,但它出现在第一个版本中,路由未注册并且对服务的任何调用 returns“404(未找到)”。

当我第一次部署到 DEV 环境时,Web API 路由没有注册,但在部署另一个构建时它神奇地工作了。 DEV 环境中的一两个其他版本引起了类似的问题,但在这些情况下,重新部署相同的构建是有效的。

现在发布到 UAT 时出现了同样的问题,但是由于部署是由另一个团队执行的,因此重新部署构建将更加耗时并且看起来不专业。我也对 PROD 中发生的这种情况保持警惕——这可能会导致实时网站比必要的更进一步。

Web API 实现

Web API 控制器位于 CMS 网站项目中,而不是单独的库。

Global.asax.cs

Global.asax.cs 文件的 Application_Start() 方法注册路由,看起来类似于以下内容:

protected void Application_Start()
{
    // Scripts Bundling here, which havs been removed for brevity
    BundleTable.EnableOptimizations = false;

    // Registering the API
    RouteTable.Routes.MapHttpRoute(
        name: "DefaultApiWithAction",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new {id = RouteParameter.Optional}
        );
}

MyController.cs

我的控制器看起来类似于 CMS 网站下存储的以下内容:CMSApp/ApiControllers/MyController.cs

[assembly: RegisterApiController(typeof(CMSApp.ApiControllers.MyController))]

namespace CMSApp.ApiControllers
{
    public class MyController : ApiController
    {
        Channel Channel = new Channel();
    
        [HttpPost]
        public int Create()
        {
            Response objResponse = Channel.Instance.DoSomething();
            HandleResponse(objResponse);
            return objResponse.SessionHandle;
        }
    }
}

在网络浏览器中,访问 /api/my/create return 是一个 404(未找到),但我希望它告诉我这是一个 POST 方法。

库版本[编辑,我已经更新了库,但问题仍然存在]

问题?

为什么第一次部署到环境中不起作用,但大多数进一步的部署都按我预期的那样工作?

问题是由于 ASP.NET 缓存。

在“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”下删除“MS-ApiControllerTypeCache.xml”后,IIS重新启动,控制器被拾起。