如何使用SDL Tridion SiteEdit 2009 SP2 / 3修复代理错误

时间:2012-11-27 17:47:48

标签: tridion tridion-2011 siteedit

当我第一次访问SiteEdit的代理网站时,所有内容都正确加载,我可以启用SiteEdit并进行正常交互。但是,如果单击页面上的任何链接,执行简单的F5刷新或直接键入代理站点的其他URL,我会收到错误。在错误页面上,我仍然看到“SiteEdit”按钮启用SiteEdit模式,但在它后面(基本上是代理页面显示的框架)我有一个简单的“代理中出现错误”消息。

在内容管理器服务器上,我可以查看应用程序事件日志,看到SiteEdit报告的错误是“从传入请求中读取错误。对象引用未设置为对象的实例。”

如果我关闭浏览器然后加载我试图访问的页面,一切正常。但是,如果我刷新或尝试转到任何其他页面(链接或直接),我再次收到错误。关闭浏览器并重复...

任何人都可以对此有所了解吗?我目前正在将SiteEdit 2009 SP2升级到SP3,这是我们的生产(SP2)和我的沙箱(SP3)环境中存在的问题。当然,我们的内容编辑器不使用SiteEdit(几乎是因为这个),我希望SP3升级可能已经解决了它的核心(但显然没有)。

我假设我已经正确配置了IE9(我的Intranet区域中有站点,我有相应的脚本权限设置,我允许弹出窗口等),因为它适用于初始渲染,但任何尝试都在转到另一个页面的同一个浏览器会话失败。

感谢您提供的任何见解。

1 个答案:

答案 0 :(得分:0)

自从我联系支持部门已经有几周了,但是在几个回程和他们最后向我询问了对象引用错误的堆栈跟踪。

这使我与我的一位同事(他们一直在深入研究Tridion的日志记录)一起调整日志配置,以便查看堆栈跟踪输出。不幸的是,在报告问题以支持我重置我正在处理的环境(因为我也一直致力于升级到Tridion 2011),当他们提出此请求时,SiteEdit没有登录应用程序事件日志,因为它配置为(我认为这可能是许可问题)。

为了获得堆栈跟踪,我的同事更改了\ Tridion \ SiteEdit 2009 \ tridion.logging.config以登录文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=349a39f202fa9b53" />
  </configSections>
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="General" logWarningsWhenNoCategoriesMatch="false">
    <listeners>
      <add name="Log File" fileName="C:\Tridion\log\SiteEdit.log" formatter="Tridion Text Formatter" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=349a39f202fa9b53" traceOutputOptions="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=349a39f202fa9b53" />
    </listeners>
    <formatters>
      <add template="{timestamp} &lt;{win32ThreadId}&gt; {message}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=349a39f202fa9b53" name="Trace Text Formatter" />
      <add template="{message}&#xA;&#xA;Component: {keyvalue(component)}&#xA;Errorcode: {keyvalue(errorcode)}&#xA;User: {keyvalue(username)}&#xA;&#xA;{keyvalue(stacktrace)}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=349a39f202fa9b53" name="Tridion Text Formatter" />
    </formatters>
    <categorySources>
      <add switchValue="All" name="General" />
    </categorySources>
    <specialSources>
      <allEvents switchValue="All" name="All Events">
        <listeners>
          <add name="Log File" />
        </listeners>
      </allEvents>
      <notProcessed switchValue="All" name="Unprocessed Category" />
      <errors switchValue="All" name="Logging Errors &amp; Warnings" />
    </specialSources>
  </loggingConfiguration>
</configuration>

一旦将日志记录配置为写出文件,我们就能看到异常的堆栈跟踪:

  

从传入的请求中读取时出错。
对象引用不是   设置为对象的实例。

组件:   SiteEdit.Proxy
错误代码:0
用户:NT AUTHORITY \ IUSR
  
StackTrace信息详情:
在   Tridion.Web.UI.SiteEdit.Proxy.Helper.CopyRequestCookies(HttpRequest的   请求,CookieContainer cookieContainer)
在   Tridion.Web.UI.SiteEdit.Proxy.Request.RequestFactory.CreateRequest(HttpRequest的   请求)   Tridion.Web.UI.SiteEdit.Proxy.Request.RequestFactory.CreateRequest(HttpRequest的   请求)   Tridion.Web.UI.SiteEdit.Proxy.RedirectModule.context_BeginRequest(对象   发件人,EventArgs e)

由于对象引用错误位于名为“CopyRequestCookies”的方法中,因此我们决定查看我们的cookie(自关闭和重新打开浏览器以来,这有意义导致SiteEdit再次运行,但仅针对单个请求)。

果然,我们有一个奇怪的cookie,用于简单地验证用户已打开cookie。 javascript代码(我认为我的开发人员从某处在线获得)是:

document.cookie = 'CookieTest';
if (document.cookie == "") {
    $("form").append('<div class="master-error"><p>Cookies are not enabled</p></div>');
}

请注意,cookie没有值(典型的JS为document.cookie = 'name=value';)。我们认为在代理逻辑中,它将为代理站点提交的cookie传递到暂存站点,有些代码没有预期到没有值的cookie(在Fiddler中,您可以看到cookie只是通过了作为“CookieTest;”),但没有进行防御编码以处理该场景。

通过更改我们的代码以将值应用于cookie document.cookie = 'CookieTest=true',SiteEdit代理正常运行。