IIS 8.5 配置导致 Sitefinity 12.1 动态 link 创建问题 (ASP.NET .NET 4.7.2)
IIS 8.5 Configuration causes an issue with Sitefinity 12.1 dynamic link creation (ASP.NET .NET 4.7.2)
我是 运行 Windows Server 2012 R2 上的 IIS 8.5。这是一个测试服务器,我有 3 个站点 运行,Dev、QA 和 Staging。
问题出在质量检查方面。 ASP.NET Sitefinity 应用程序 运行 在动态创建链接时会解析不正确的域名。具体来说,它在域中使用 www 而不是 qa。所以,https://qa.myexamplesite.com is the desired link, but it creates https://www.myexamplesite.com.
有一个 www.myexamplesite.com,但它托管在完全不同的机器上。此外,应用程序代码不包含对域的引用。
Dev 和 Staging 工作正常。我改变了QA的物理路径指向Dev,但是QA还是坏了。我更改了 Dev 的物理路径以指向 QA 应用程序代码,但 Dev 没有中断 - 仍然可以正常工作。在这一点上,我有理由相信 IIS 中存在配置问题,但到目前为止我一直无法找到它。我也无法在我的本地计算机上重现该问题。
以下是 ApplicationHost 文件中的配置详细信息,省略了任何敏感或不相关的信息:
<applicationPools>
<add name="DefaultAppPool" />
<add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
<add name=".NET v4.5" managedRuntimeVersion="v4.0" />
<add name="dev.myexamplesite.com" autoStart="true" />
<add name="staging.myexamplesite.com" autoStart="true" />
<add name="qa.myexamplesite.com" />
<applicationPoolDefaults managedRuntimeVersion="v4.0">
<processModel identityType="ApplicationPoolIdentity" />
</applicationPoolDefaults>
</applicationPools>
<sites>
<site name="dev.myexamplesite.com" id="1" serverAutoStart="true">
<application path="/" applicationPool="dev.myexamplesite.com">
<virtualDirectory path="/" physicalPath="S:\Dev\myexamplesite" />
<virtualDirectory path="/App_Data/Sitefinity/Search" physicalPath="S:\Dev\SitefinitySearch" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:dev.myexamplesite.com" />
<binding protocol="https" bindingInformation="*:443:dev.myexamplesite.com" sslFlags="0" />
</bindings>
</site>
<site name="staging.myexamplesite.com" id="3" serverAutoStart="true">
<application path="/" applicationPool="staging.myexamplesite.com">
<virtualDirectory path="/" physicalPath="S:\Staging\myexamplesite" />
<virtualDirectory path="/App_Data/Sitefinity/Search" physicalPath="S:\Staging\SitefinitySearch" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:staging.myexamplesite.com" />
<binding protocol="https" bindingInformation="*:443:staging.myexamplesite.com" sslFlags="0" />
</bindings>
</site>
<site name="qa.myexamplesite.com" id="2" serverAutoStart="true">
<application path="/" applicationPool="qa.myexamplesite.com">
<virtualDirectory path="/" physicalPath="S:\QA\myexamplesite" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:443:qa.myexamplesite.com" sslFlags="0" />
<binding protocol="http" bindingInformation="*:80:qa.myexamplesite.com" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
我一直在研究资源,试图找到可能存在此问题的位置。该应用程序使用 Sitefinity 专有方法来动态创建链接,因此我无法确定他们使用的是什么方法。这是我能够记录的一些奇怪行为。
我可以刷新 IIS、flushdns 等,但行为没有改变。我已经重新启动了服务器,但问题仍然存在。
刷新后,如果我使用服务器上的浏览器导航到该站点,则 URL 会一致地正确解析。如果我从隐身浏览器导航到该站点,那么类似地,URL 是正确的,直到我重新加载几次,通常在第二或第三页加载时,URL 再次不正确。无论我使用什么浏览器,都是如此。
这似乎是一个 IIS 缓存问题 - 但我无法找到它的配置位置。我无法检测到已配置的输出缓存。
(旁白) 如果有帮助 - 应用程序代码正在从开源的 Sitefinity 库 feather 中调用此方法:
https://github.com/Sitefinity/feather/blob/master/Telerik.Sitefinity.Frontend/Mvc/Helpers/HyperLinkHelpers.cs
它专门调用了 GetFullPageUrl(第 149 行)。但是,我发现它的用途有限,因为它调用了专有 Telerik.Sitefinity.Web.
的成员 UrlPath
我感谢任何关于这个问题的见解、资源、方向、想法或指责。
谢谢
您可以转到“管理”>“设置”>“高级”>“系统”>“站点”URL 设置
并查看是否选中启用非默认站点 URL 设置,以及主机字段是否硬编码到任何其他站点。
如果是这样,您可能需要更正它。
我想部分归功于 Veselin Vasilev 因为他走在正确的轨道上。所以这就是发生的事情以及我们如何修复它。
在错误开始出现时,我们有另一个 Sitefinity 实例 运行 并指向 QA 数据库。由于某种原因,Sitefinity 在此事件后开始引用一段数据库配置。目前还不清楚这个触发器到底是什么,或者是什么让它在那个事件发生之前用这个不正确的信息工作了这么久。
有问题的数据库配置是一个名为 sf_sites 的 table。必须更改名为 live_url 的条目才能解决此问题。我们在测试环境中恢复了 Sitefinity 的生产实例以测试 Sitefinity 升级,但不知道 Sitefinity 数据库保留了域名记录。
Veselin 谈论的配置覆盖了 live_url 属性(尽管我永远无法使该覆盖正常工作)。奇怪的是,几个月前我们用生产数据库恢复了测试数据库,但从未遇到过问题。直到我们有多个站点访问同一个数据库时,问题才出现,甚至在删除第二个站点后也不会消失。
无论如何,更新 sf_sites table 是成功的方法。如果您需要将一个环境的 Sitefinity 数据库复制到新环境中,请将此添加到您的清单中。
我是 运行 Windows Server 2012 R2 上的 IIS 8.5。这是一个测试服务器,我有 3 个站点 运行,Dev、QA 和 Staging。
问题出在质量检查方面。 ASP.NET Sitefinity 应用程序 运行 在动态创建链接时会解析不正确的域名。具体来说,它在域中使用 www 而不是 qa。所以,https://qa.myexamplesite.com is the desired link, but it creates https://www.myexamplesite.com.
有一个 www.myexamplesite.com,但它托管在完全不同的机器上。此外,应用程序代码不包含对域的引用。
Dev 和 Staging 工作正常。我改变了QA的物理路径指向Dev,但是QA还是坏了。我更改了 Dev 的物理路径以指向 QA 应用程序代码,但 Dev 没有中断 - 仍然可以正常工作。在这一点上,我有理由相信 IIS 中存在配置问题,但到目前为止我一直无法找到它。我也无法在我的本地计算机上重现该问题。
以下是 ApplicationHost 文件中的配置详细信息,省略了任何敏感或不相关的信息:
<applicationPools>
<add name="DefaultAppPool" />
<add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
<add name=".NET v4.5" managedRuntimeVersion="v4.0" />
<add name="dev.myexamplesite.com" autoStart="true" />
<add name="staging.myexamplesite.com" autoStart="true" />
<add name="qa.myexamplesite.com" />
<applicationPoolDefaults managedRuntimeVersion="v4.0">
<processModel identityType="ApplicationPoolIdentity" />
</applicationPoolDefaults>
</applicationPools>
<sites>
<site name="dev.myexamplesite.com" id="1" serverAutoStart="true">
<application path="/" applicationPool="dev.myexamplesite.com">
<virtualDirectory path="/" physicalPath="S:\Dev\myexamplesite" />
<virtualDirectory path="/App_Data/Sitefinity/Search" physicalPath="S:\Dev\SitefinitySearch" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:dev.myexamplesite.com" />
<binding protocol="https" bindingInformation="*:443:dev.myexamplesite.com" sslFlags="0" />
</bindings>
</site>
<site name="staging.myexamplesite.com" id="3" serverAutoStart="true">
<application path="/" applicationPool="staging.myexamplesite.com">
<virtualDirectory path="/" physicalPath="S:\Staging\myexamplesite" />
<virtualDirectory path="/App_Data/Sitefinity/Search" physicalPath="S:\Staging\SitefinitySearch" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:staging.myexamplesite.com" />
<binding protocol="https" bindingInformation="*:443:staging.myexamplesite.com" sslFlags="0" />
</bindings>
</site>
<site name="qa.myexamplesite.com" id="2" serverAutoStart="true">
<application path="/" applicationPool="qa.myexamplesite.com">
<virtualDirectory path="/" physicalPath="S:\QA\myexamplesite" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:443:qa.myexamplesite.com" sslFlags="0" />
<binding protocol="http" bindingInformation="*:80:qa.myexamplesite.com" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
我一直在研究资源,试图找到可能存在此问题的位置。该应用程序使用 Sitefinity 专有方法来动态创建链接,因此我无法确定他们使用的是什么方法。这是我能够记录的一些奇怪行为。
我可以刷新 IIS、flushdns 等,但行为没有改变。我已经重新启动了服务器,但问题仍然存在。
刷新后,如果我使用服务器上的浏览器导航到该站点,则 URL 会一致地正确解析。如果我从隐身浏览器导航到该站点,那么类似地,URL 是正确的,直到我重新加载几次,通常在第二或第三页加载时,URL 再次不正确。无论我使用什么浏览器,都是如此。
这似乎是一个 IIS 缓存问题 - 但我无法找到它的配置位置。我无法检测到已配置的输出缓存。
(旁白) 如果有帮助 - 应用程序代码正在从开源的 Sitefinity 库 feather 中调用此方法: https://github.com/Sitefinity/feather/blob/master/Telerik.Sitefinity.Frontend/Mvc/Helpers/HyperLinkHelpers.cs
它专门调用了 GetFullPageUrl(第 149 行)。但是,我发现它的用途有限,因为它调用了专有 Telerik.Sitefinity.Web.
的成员 UrlPath我感谢任何关于这个问题的见解、资源、方向、想法或指责。 谢谢
您可以转到“管理”>“设置”>“高级”>“系统”>“站点”URL 设置 并查看是否选中启用非默认站点 URL 设置,以及主机字段是否硬编码到任何其他站点。
如果是这样,您可能需要更正它。
我想部分归功于 Veselin Vasilev 因为他走在正确的轨道上。所以这就是发生的事情以及我们如何修复它。
在错误开始出现时,我们有另一个 Sitefinity 实例 运行 并指向 QA 数据库。由于某种原因,Sitefinity 在此事件后开始引用一段数据库配置。目前还不清楚这个触发器到底是什么,或者是什么让它在那个事件发生之前用这个不正确的信息工作了这么久。
有问题的数据库配置是一个名为 sf_sites 的 table。必须更改名为 live_url 的条目才能解决此问题。我们在测试环境中恢复了 Sitefinity 的生产实例以测试 Sitefinity 升级,但不知道 Sitefinity 数据库保留了域名记录。
Veselin 谈论的配置覆盖了 live_url 属性(尽管我永远无法使该覆盖正常工作)。奇怪的是,几个月前我们用生产数据库恢复了测试数据库,但从未遇到过问题。直到我们有多个站点访问同一个数据库时,问题才出现,甚至在删除第二个站点后也不会消失。
无论如何,更新 sf_sites table 是成功的方法。如果您需要将一个环境的 Sitefinity 数据库复制到新环境中,请将此添加到您的清单中。