おはようございます!私はこれを理解しようと半日も過ごしました。うまくいけばあなたの1人が助けることができる。WCFサービス内からのRenderControlが失敗します。 ASMX作品
私は限られた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でのITは、別のプロジェクトに住んでいる)です。
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と同じエラーが発生します。
これは問題だと思われます。私は.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) –