2009-07-29 7 views
1

Guten Tag! Ich habe den halben Tag damit verbracht, das herauszufinden. Hoffentlich kann einer von euch helfen.RenderControl aus WCF-Dienst schlägt fehl; ASMX funktioniert

Ich habe ein begrenztes CMS geschrieben und arbeite daran, dass Inhalte aus dem CMS als Interstitial-Seiten in externen Sites angezeigt werden können. Zu diesem Zweck wollte ich einen WCF-Dienst erstellen, der den entsprechenden Inhalt rendert und als Zeichenfolge zurückgibt, die auf der Clientseite platziert werden soll.

Allerdings bin ich in ein seltsames Verhalten geraten. Die RadioButtonList und CheckBoxList Kontrollen am Ende werfen NullReferenceException während RenderControlInternal (offensichtlich nicht mein Beitrag). Alle anderen Steuerelemente (Textfelder, Listenfelder, Dropdown-Menüs, benutzerdefinierte zusammengesetzte Steuerelemente) werden ordnungsgemäß wiedergegeben.

Ich habe einen ASMX-Dienst neben dem WCF-Dienst erstellt und den Code direkt aus dem WCF-Dienst ausgeschnitten/eingefügt. Es macht die Kontrollen perfekt.

Hinweise, warum der WCF-Dienst selektiv Bomben verursacht? Hier

ist der Service-Methode Code:

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; 
    } 

Hier ist der Code für ControlHelper.RenderControl (ja, es ist in VB Er lebt in einem anderen Projekt.).

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 

Die Ausnahmebedingungsnachricht ist "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt." Hier

ist ein Stacktrace der Exception ausgelöst, wenn WCF verwendet wird:

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 

Hat der WCF-Dienst zurückgeben die richtige Zeichenfolge, wenn separat aufgerufen?

Ich bin mir nicht sicher, ob ich Ihre genaue Bedeutung verstehe. Getrennt von was? Wenn ich die Business-Klasse, die die Verarbeitung von einem Test-Kabelbaum ausführt, aufruft, funktioniert es ja korrekt. Wenn ich es von einem ASMX-Dienst anrufe, funktioniert es richtig. In WCF bricht das Rendering von Radiobuttons ab.

Welche Art von Bindung und Sicherheit verwenden Sie für den WCF-Dienst?

Ich benutze 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> 

Wenn Sie den Kundendienst rufen in z.B. SoapUI - gibt es die Zeichenfolge im erwarteten Format zurück? Oder könnten einige Tags und/oder Sonderzeichen kaputt gemacht werden?

Von SoapUI wird auch nicht ordnungsgemäß gerendert, der gleiche Fehler tritt auf, wie von WCF.

Antwort

0

Gibt der WCF-Dienst bei separatem Aufruf die richtige Zeichenfolge zurück? Welche Art von Bindung und Sicherheit verwenden Sie für den WCF-Dienst? Können Sie einige Konfigurationen (serverseitig und möglicherweise clientseitig) posten?

Die Bindung, die dem ASMX-Legacy-Dienst am nächsten wäre, wäre basicHttpBinding mit praktisch allen deaktivierten Sicherheitseinstellungen. Benutzt du das?

Wenn Sie den Dienst z. SoapUI - gibt es die Zeichenfolge im erwarteten Format zurück? Oder könnten einige Tags und/oder Sonderzeichen kaputt gemacht werden?

2

Haben Sie versucht, ASP.NET compatibility mode in Ihrer WCF-Konfiguration einzuschalten? Der Fehler hängt wahrscheinlich damit zusammen, dass der HttpContext nicht verfügbar ist (obwohl ich sagen kann, dass Ihr aktueller Ansatz, obwohl wahrscheinlich praktikabel, ziemlich hässlich ist :-))

+0

Ich vermute, dass dies das Problem sein könnte. Ich habe System.Web.UI.WebControls.RadioButtonList.Render mit .NET Reflector geöffnet und diesen Code gefunden: "If (Not MyBase.DesignMode AndAlso Not Me.Context.Request.Browser.Tables) Then". Wenn page.Context den Wert "Context" hat, wird "HttpContext.Current" zurückgegeben. –

+0

Oder da der Großteil der Frage in C# gepostet wurde: if (! Base.DesignMode &&! This.Context.Request.Browser.Tables) –