2009-07-29 15 views
1

おはようございます!私はこれを理解しようと半日も過ごしました。うまくいけばあなたの1人が助けることができる。WCFサービス内からのRenderControlが失敗します。 ASMX作品

私は限られた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での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と同じエラーが発生します。

答えて

0

別途呼び出したときにWCFサービスが正しい文字列を返しますか? WCFサービスにはどのようなバインディングとセキュリティが使用されていますか?あなたはいくつかのconfigs(サーバー側、そしておそらくクライアント側)を投稿できますか?

ASMXレガシーサービスに最も近いバインディングは、基本的にすべてのセキュリティをオフにしてbasicHttpBindingになります。あなたはそれを使用していますか?

サービスをたとえばSoapUI - 期待どおりの形式の文字列を返しますか?あるいは、いくつかのタグや特殊文字が混乱するかもしれませんか?

2

WCF設定でASP.NET compatibility modeをオンにしましたか?このエラーはおそらくHttpContextが利用できないことに関連している可能性があります(私がそれを言うかもしれないが、あなたの現在のアプローチはおそらく実行可能ですが、かなり醜いです:-))

+0

これは問題だと思われます。私は.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を返します。 –

+0

質問のほとんどがC#で掲示されていたので:if(!base.DesignMode &&!this.Context.Request.Browser.Tables) –

関連する問題