下午好!我花了半天时间想办法解决这个问题,希望你们中的一个人能帮上忙。
我已经写了一个有限的CMS,并正在致力于允许内容从CMS显示为间隙页面在外部网站。为此,我希望创建一个WCF服务,该服务将呈现适当的内容,并将其作为字符串返回到客户端页面中。
然而,我遇到了一种奇怪的行为。RadioButtonList和CheckBoxList控件最终在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 61WCF服务单独调用时是否返回正确的字符串?
我不太明白你的确切意思。和什么分开?如果我调用从测试工具进行处理的业务类,是的,它正确工作。当我从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中。
发布于 2009-07-29 21:58:02
您试过在WCF配置中打开ASP.NET兼容模式吗?该错误可能与HttpContext不可用有关(尽管我可以这样说,您目前的方法虽然可行,但很难看:-)
发布于 2009-07-29 20:42:01
WCF服务单独调用时是否返回正确的字符串?WCF服务使用什么样的绑定和安全性?你能发布一些信任(服务器端,可能是客户端)吗?
与ASMX遗留服务最接近的绑定将是basicHttpBinding,基本上关闭了所有安全性。你在用那个吗?
如果您以例如SoapUI调用服务-它是否以预期的格式返回字符串?或者一些标签和/或特殊字符可能会被弄坏?
https://stackoverflow.com/questions/1202856
复制相似问题