【问题标题】:RenderControl from within WCF service fails; ASMX worksWCF 服务中的 RenderControl 失败; ASMX 工作
【发布时间】:2009-07-29 20:32:54
【问题描述】:

下午好!我花了半天的时间试图弄清楚这一点。希望你们中的一个可以提供帮助。

我编写了一个有限的 CMS,并且正在努力让 CMS 中的内容在外部网站中显示为插页式页面。为此,我想创建一个 WCF 服务,该服务将呈现适当的内容并将其作为要放入客户端页面的字符串返回。

但是,我遇到了一个奇怪的行为。 RadioButtonListCheckBoxList 控件最终会在 RenderControlInternal 期间抛出 NullReferenceException(显然不是我的贡献)。所有其他控件(文本框、列表框、下拉列表、自定义复合控件)都可以正常渲染。

我在 WCF 服务旁边创建了一个 ASMX 服务,并直接从 WCF 服务剪切/粘贴代码。它完美地呈现了控件。

任何线索为什么 WCF 服务会选择性地引发炸弹?

服务方法代码如下:

    public string RenderPageContents(int pageId)
    {
        string output = string.Empty;

        SiteBuilder.Page p = new SiteBuilder.Page();
        if (p.Load(pageId))
        {
            foreach (SiteBuilder.PageItem pi in p.Items)
            {
                if (pi.LoadItemDetails(true))
                {
                    // Calls LoadControl from \Bin
                    Web.Controls.Base.BuilderControlBase bcb =
                          Web.Controls.ControlHelper.CreateSiteBuilderControl(
                              @"C:\Development\SitebuilderService\", 
                             pi.ItemDetails);

                    if (bcb != null)
                    {
                        bcb.Configure(pi);
                        output += ControlHelper.RenderControl(ref bcb);
                    }
                }
            }
        }

        return output;
    }

这是ControlHelper.RenderControl 的代码(是的,它在 VB 中。它存在于另一个项目中)。

Public Shared Function RenderControl(ByRef ctrl As Controls.Base.BuilderControlBase) _
      As String
    Dim sb As New StringBuilder()
    Dim tw As New StringWriter(sb)
    Dim hw As New HtmlTextWriter(tw)

    ctrl.RenderControl(hw)

    Return sb.ToString()
End Function

异常消息是“对象引用未设置为对象的实例”。

这是使用 WCF 时抛出的异常的堆栈跟踪:

at System.Web.UI.WebControls.RadioButtonList.Render(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
at System.Web.UI.WebControls.TableCell.RenderContents(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
at System.Web.UI.WebControls.Table.RenderContents(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
at System.Web.UI.WebControls.TableCell.RenderContents(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) 
at System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) 
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
at XXX.ControlHelper.RenderControl(BuilderControlBase& ctrl) 
    in C:\TFS\XXX\Development\XXX\Web\Controls\Builder\Helpers\ControlHelper.vb:line 81 
at XXX.Services.SiteBuilderService.RenderPageContents(Int32 pageId) 
    in C:\TFS\Development\XXX.Web.Services\XXX.Web.Services\SiteBuilderService.svc.cs:line 61

单独调用 WCF 服务是否返回正确的字符串?

我不确定我是否理解您的确切含义。与什么分开?如果我调用从测试工具进行处理的业务类,是的,它可以正常工作。当我从 ASMX 服务调用它时,它可以正常工作。在 WCF 中,单选按钮呈现中断。

您对 WCF 服务使用什么样的绑定和安全性?

我正在使用 basicHttpBinding。

<binding name="BasicHttpBinding_ISiteBuilderService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="1024000" maxBufferPoolSize="524288" maxReceivedMessageSize="1024000"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="1024000" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>


<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISiteBuilderService" contract="SiteBuilder.ISiteBuilderService" name="BasicHttpBinding_ISiteBuilderService" />

<service behaviorConfiguration="Xxx.SiteBuilderServiceBehavior"
   name="Xxx.Services.SiteBuilderService">
    <endpoint address="" binding="basicHttpBinding" contract="Kaplan.OEC.Services.ISiteBuilderService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>

<behavior name="Xxx.Services.SiteBuilderServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>

如果您调用服务,例如SoapUI - 它是否以预期格式返回字符串?或者某些标签和/或特殊字符可能会被弄乱?

从 SoapUI 也无法正确渲染,与 WCF 出现相同的错误。

【问题讨论】:

    标签: asp.net wcf dynamic content-management-system


    【解决方案1】:

    您是否尝试过在 WCF 配置中打开 ASP.NET compatibility mode?该错误可能与 HttpContext 不可用有关(尽管我可以这么说,您当前的方法虽然可能可行,但相当丑陋:-))

    【讨论】:

    • 我怀疑这可能是问题所在。我使用 .NET Reflector 打开了 System.Web.UI.WebControls.RadioButtonList.Render 并找到了这段代码:“If (Not MyBase.DesignMode AndAlso Not Me.Context.Request.Browser.Tables) Then”。查看 Context,如果 page.Context 为 null,则返回 HttpContext.Current。
    • 或者因为大部分问题都是用 C# 发布的:if (!base.DesignMode && !this.Context.Request.Browser.Tables)
    【解决方案2】:

    WCF 服务在单独调用时是否返回正确的字符串?您对 WCF 服务使用什么样的绑定和安全性?你能发布一些配置(服务器端,可能还有客户端)吗?

    最接近 ASMX 旧服务的绑定是 basicHttpBinding,基本上所有安全性都已关闭。你在用那个吗?

    如果您调用服务,例如SoapUI - 它是否以预期格式返回字符串?或者,一些标签和/或特殊字符可能会被弄乱?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多