Datenpunkte
Daten-Leistung und Fault-Strategien in Silverlight 3
John Papa
Dieser Artikel basiert auf Vorabversionen von Silverlight 3.

Inhalt
Silverlight-Anwendungen nutzen häufig von Webdiensten für Ihre Daten.
Die Leistung der Datenabruf und die Möglichkeit, aussagekräftige Informationen über Ausnahmen abzurufen, die in Web Services auftreten können, sind zwei wichtige Bereiche, die in Silverlight-3 verbessert wurden.
Eine schlechte Leistung kann eine Anwendung Killer sein.
Gute Strategien zum Abrufen von Daten aus einem Webdienst können helfen, aber manchmal ist es erforderlich, um ein Objektdiagramm abzurufen, die sehr lange dauern, die von einem Webdienst an einen Client übergeben und sehr groß werden können.
Silverlight 3 bietet ein neues Feature, das Daten aus einem Webdienst mit binärer Codierung übergibt und diese kann Leistung deutlich verbessern, wenn große Objektgraphen übergeben.
Viel kann falsche wechseln, wenn Daten zwischen Diensten und Silverlight-Anwendungen übergeben.
Dies ist deshalb wichtig, eine gute Strategie für die Behandlung von Ausnahmen, die beim Aufrufen eines Webdienstes auftreten.
Silverlight 3 bietet einige Netzwerkverbesserungen, mit denen Entwickler Weitere Optionen, Informationen über verwaltete Ausnahmen von Webdiensten zu übergeben.
Im Artikel dieses Monats werde ich wie binäre Codierung arbeitet, die Auswirkungen zeigen, es auf einer Anwendung Leistung und wie es hat durch in Aktion demonstrieren verhält.
Ich führt auch über mehrere Techniken, die nicht deklarierte und deklarierte Fehlern von Windows Communication Foundation (WCF)-Webdiensten zu Silverlight mit Ausnahmeinformationen übergeben verwendet werden können.
Zunächst wird demonstriert, was passiert, wenn eine Ausnahme auftritt und zum Hinzufügen von einige schnelle an der Konfiguration Informationen Änderungen während des Debuggens anzeigen.
Dann ich erfahren Sie, wie festgelegt, ein Muster strategische Fehlertoleranz übergeben Ausnahme behandeln deklariert Informationen über SOAP-Diensten, mit Fehlern.
Der gesamte Code basiert auf der Betaversion 3 von Silverlight und begleitet diesen Artikel online.
Erstellt für Geschwindigkeit
SOAP und XML übergeben als Text schwerwiegend bloats die Nachricht zwischen WCF und Silverlight übergeben wird.
Dies kann eine negative Auswirkung auf Leistung in beide Verarbeitung der Daten und die Zeit, die Daten über HTTP übergeben haben.
Silverlight-3 enthält die Möglichkeit, eine binäre Nachrichtencodierer mit WCF-Diensten verwenden, die mit Silverlight-3-Clientanwendungen kommunizieren.
Binäre Nachrichtencodierer verbessern die Leistung von WCF-Diensten, besonders wenn übergeben große Diagramme Objekte.
Die größte Gewinne in Leistung mithilfe des binären Nachrichtencodierung werden realisiert, beim Übergeben von Arrays, Zahlen und Objektgraphen; weniger Gewinne sind mit sehr kleine Nachrichten und Zeichenfolgen gefunden.
Dies ist keine Strategie Komprimierung, so dass keine negativen Auswirkungen auf Leistung für Packen und Entpacken komprimierte Daten.
Jedoch binäre Codierung in der Regel die Größe der übergebenen Daten reduzieren.
Verringerung der Größe ist nicht gewährleistet, aber sofort offensichtlich ist, bei großen Objektdiagrammen und ganzzahlige Daten.
Die Schlüssel Verbesserung gewonnen aus binäre Codierung ist, dass es optimiert wird, um Server Durchsatz zu erhöhen.
Konfigurieren die binäre Codierung
WCF-Dienste können mit der Verwendung von BasicHttpBinding, die Daten als Text über HTTP sendet Silverlight 2-Anwendungen kommunizieren.
Bei Verwendung der Vorlage Silverlight-enabled WCF Service Datei –, wird beim Installieren von Silverlight Tools für Visual Studio installiert, um einen WCF-Dienst für Silverlight 2 zu erstellen, die Bindung konfiguriert wurde, BasicHttpBinding verwenden.
Diese Datei Vorlage wurde geändert in Silverlight 3, um den WCF-Dienst für binäre Nachrichtencodierer anstelle von Text verwenden konfigurieren.
Die Vorlage Silverlight-enabled WCF Service Datei konfiguriert WCF-Dienst binär-codierte messaging verwenden.
Wenn Sie einen vorhandenen WCF-Dienst verwenden, kann es für die binäre Codierung durch Erstellen einer benutzerdefinierten Bindung in der Datei Web.config im Abschnitt Bindungen Nachricht verwenden, konfiguriert werden.
Das folgende Codebeispiel zeigt die benutzerdefinierte Bindung mit dem Namen SilverlightCustomBinding, wie er in der <system.serviceModel>-Abschnitt einer Konfigurationsdatei angezeigt wird.
Die SilverlightCustomBinding, BinaryMessageEncoding, Verwendung konfiguriert wird dann über seinen Namen in der Dienstendpunktkonfiguration verwiesen.
<endpoint address="" binding="silverlightCustomBinding"
contract="MyTestService" />
<bindings>
<customBinding>
<binding name="silverlightBinaryBinding">
<binaryMessageEncoding />
<httpTransport />
</binding>
</customBinding>
</bindings>
Da BasicHttpBinding Meldungen als Text über HTTP sendet, ist es einfach, die Nachrichten über ein Tool wie z. B. Fiddler zu debuggen.
Während BasicHttpBinding noch konfiguriert werden kann, können die Vorteile des binären Encoder so sein, dass es die empfohlene Vorgehensweise.
Es ist leicht zu hin-und Umschalten zwischen Binärdatei und Text, allein durch Ändern der Config-Datei.
Dies ist hilfreich beim Debuggen von WCF-Dienst.
Binäre Codierung wird nur von WCF-Dienste und Clients unterstützt.
Wenn Sie eine Clientanwendung nicht WCF Ihres WCF-Diensts nutzen, empfiehlt es sich nicht, binäre Codierung verwenden.
Binärdaten oder Textdaten
Die erste Demo zeigt die Unterschiede in Konfiguration und Leistung zwischen BasicHttpBinding und einer binären Nachrichtencodierung zwischen WCF und Silverlight 3.
Die Beispielanwendung in diesem Artikel enthaltenen teilt beide Beispiele (Text und Binary) in separate Dienste, die vom selben Silverlight-3-Client aufgerufen werden kann.
Die Konfiguration für diese Dienste in der Datei Web.config der Beispielanwendung ist in Abbildung 1 dargestellt.
Die Unterschiede zwischen dem Text und die binäre Codierung Konfigurationen sind fett dargestellt.
Beachten Sie, dass der Dienst SpeedService0 der BasicHttpBinding verwendet während SpeedService1 eine CustomBinding mit die Bindungskonfiguration mit dem Namen SilverlightBinaryBinding (im vorherigen Codebeispiel gezeigt.) verwendet

Abbildung 1 Konfigurieren von Text oder Binär
<services>
<service
behaviorConfiguration="SilverlightFaultData.Web.SpeedServiceBehavior"
name="SilverlightFaultData.Web.SpeedService0">
<endpoint address="" binding="basicHttpBinding"
contract="SilverlightFaultData.Web.SpeedService0" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
<service
behaviorConfiguration="SilverlightFaultData.Web.SpeedServiceBehavior"
name="SilverlightFaultData.Web.SpeedService1">
<endpoint address="" binding="customBinding"
bindingConfiguration="silverlightBinaryBinding"
contract="SilverlightFaultData.Web.SpeedService1" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
Die Dienste SpeedService0 und SpeedService1 abrufen beide alle Produkte und jedes Produkt-Kategorie, Lieferanten und Order Details.
Die Abfrage (siehe Abbildung 2 ) verwendet das Entity Framework, um das Objektdiagramm abrufen.

Abbildung 2 Abrufen einer Objekt-Diagramm
[OperationContract]
public IList<Products> DoWork()
{
var ctx = new NorthwindEFEntities();
var query = from p in ctx.Products
.Include("Categories")
.Include("Suppliers")
.Include("OrderDetails")
select p;
var productList = query.ToList<Products>();
return productList;
}
Einer der die besten Aspekte der die Codierung der binären Nachricht ist, dass nur Änderungen in der Konfigurationsdatei gefunden werden.
Mit dem Code müssen keine Änderungen vorgenommen werden.
Wenn Sie die Beispielanwendung ausführen, und die Codierungsoption Text (wie in Abbildung 3 dargestellt) aktiviert ist, wird der Dienst, der BasicHttpBinding verwendet, ausgeführt.
Das Objektdiagramm zurückgegeben, und verwenden eine HTTP-Überwachungstool wie Fiddler oder FireBug, die Ergebnisse zeigen, dass das Objektdiagramm in Form von Text 4 MB in Größe wurde und 850ms abgerufen hat.
Wenn Sie die Codierung die Option Binary auswählen, wird das Objektdiagramm zurückgegeben ist 3 MB und dauerte 600ms zum Abrufen.
Dies zwar ein kleines Beispiel mithilfe von ein mittlerer Größe Objektdiagramm aus der Datenbank Northwind, die Ergebnisse werden in einer Zeile mit der
Silverlight-Webdienst Team benchmarks
.
In diesem Beispiel die binäre Codierung verwenden das Objektdiagramm enthält über 2.300 insgesamt Objekten und wird die Größe von 25 % reduziert und ist schneller als die Textcodierung 30 %.
Abbildung 3 Abrufen der Daten über BasicHttpBinding
Fehlermeldungen sind Daten
Wenn verwalteten Ausnahmen werden in einem Webdienst ausgelöst, Sie können nicht in einer SOAP-Nachricht konvertiert und an eine Silverlight 2-Clientanwendung.
Darüber hinaus kann nicht in Silverlight 2 SOAP-Fehler gelesen werden.
Diese beiden Probleme erschweren die Debuggen-Webdienste mit Silverlight 2.
Da SOAP-Faults mit Silverlight 2 verwendet werden kann, ist eine häufige Fehlermeldung, die meisten Silverlight 2-Entwickler schließlich beim Zugriff auf einen Webdienst der berüchtigte "remote-Server hat einen Fehler zurückgegeben: NotFound," keine pratical Informationen enthält.
Die ursprüngliche Ausnahme und die Details sind nicht an den Client Silverlight 2 transportiert wodurch die Webdienste schwierig zu debuggen.
Fehlermeldungen enthalten Daten, die häufig als kritisch zu bestimmen, wie die Client-Anwendung reagieren soll.
Abbildung 4 zeigt z. B. die Ergebnisse der Aufrufen eines Webdienstes eine Ausnahme ausgelöst, da die Datenbank gefunden werden kann.
Abbildung 4 Berüchtigten NotFound-Fehler
Wenn die Ausnahme ausgelöst wird, wird ein HTTP-Statuscode 500 an Silverlight zurückgegeben.
Der Browser-Netzwerkstapel verhindert, dass Silverlight Antworten mit dem Statuscode 500, lesen, sodass alle enthaltenen SOAP-Fault Informationen für die Silverlight-Clientanwendung nicht verfügbar ist.
Auch wenn die Meldung abgerufen werden konnte, kann Silverlight 2 nicht den Fehler wieder in eine verwaltete Ausnahme konvertieren.
Diese beiden Probleme wurden in Silverlight-3 behoben.
Übernehmen die Probleme
Behandlung von Ausnahmen mit WCF und Silverlight-3 erfordert diese beiden Probleme bearbeitet.
Zuerst muss für die Ausnahme an den Silverlight-Client zurückgegeben werden, ohne den Browser-Netzwerkstack verhindert, dass Silverlight Lesen der Statuscode von 500 etwas geändert werden, mit dem Silverlight die Antwort lesen können.
Dies kann durch Ableiten von der BehaviorExtensionElement und implementieren die IEndpointBehavior-Klasse, sodass den Statuscode von 500 zu 200 vor immer eine Fehlertoleranz ändern erreicht tritt ein, und die Dienste für das Verhalten in der Konfigurationsdatei festlegen.
Die MSDN-Dokumentation enthält ein
WCF-Endpunktverhalten
kann dazu verwendet werden und ermöglichen somit Silverlight Clients Zugriff auf den Inhalt des Fehlers.
Das folgende Codebeispiel zeigt den speziellen Code in der SilverlightFaultBehavior-Klasse, die den Statuscode konvertiert:
public void BeforeSendReply(ref Message reply, object correlationState)
{
if (reply.IsFault)
{
HttpResponseMessageProperty property =
new HttpResponseMessageProperty();
// Here the response code is changed to 200.
property.StatusCode = System.Net.HttpStatusCode.OK;
reply.Properties[HttpResponseMessageProperty.Name] = property;
}
}
Die SilverlightFaultBehavior-Klasse kann in der Datei Web.config als Verhaltenserweiterung verwiesen werden, wie im folgenden Codeausschnitt gezeigt:
<extensions>
<behaviorExtensions>
<add name="silverlightFaults"
type="SilverlightFaultBehavior.SilverlightFaultBehavior,
SilverlightFaultBehavior, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
Mit den SilverlightFaultBehavior an Stelle erhält das zweite Problem Silverlight in der Lage die Fehlertoleranz zu einer verwalteten Ausnahme konvertieren, sodass er gelesen werden kann.
Obwohl dies nicht möglich mit Silverlight 2 ist, hat Silverlight 3 jetzt die Möglichkeit zum Verarbeiten von Fehlern.
Dies ermöglicht Silverlight 3, um eine Fehlertoleranz und entsprechende Informationen darstellen, die dem Benutzer gelesen, wenn in einem Webdienst eine Ausnahme ausgelöst wird.
Der gesamte Prozess lesen die Ausnahmeinformationen in Silverlight 3 führt aussehen:
1) Ist in einem Webdienst Ausnahme.
2) Der Dienst verwendet die SilverlightFaultBehavior, um den HTTP-Statuscode von 500 auf 200 zu konvertieren.
3) Die Ausnahme in einen SOAP-Fehler konvertiert und an den Silverlight-3-Client übergeben.
4) Des Browsers ermöglicht Silverlight die Nachricht lesen, da ihm einen Statuscode 200.
5) Code in der Silverlight-3-Anwendung überprüft den Typ des Fehlers festzustellen, ob es eine FaultException oder einer FaultException <exceptiondetail> ist.
Nicht deklarierter Fehler
SOAP-basierte WCF-Dienste kommunizieren mithilfe von SOAP-Fault Nachrichten Fehler oder verwalteten Ausnahmen.
Daher .NET-verwaltetem Ausnahmen werden in einer SOAP-Fehler an den Client übergeben konvertiert und dann übersetzten wieder zu einem verwalteten Ausnahme.
Fehlern können nicht deklariert oder deklariert und alle sind stark typisiert.
Nicht deklarierte Fehlern werden nicht im Vorgangsvertrag angegeben, und sollte nur zum Debuggen verwendet werden.
Nicht deklarierte Fehlern zurückgegeben an den Client die Ausnahmemeldung, genau wie es im Webdienst ausgelöst wurde.
Um eine nicht deklarierte Fehlertoleranz zu ermöglichen, muss das Config-Element IncludeExceptionDetailInFaults-Attribut auf true festgelegt werden, wie unten dargestellt:
<serviceDebug>
<behavior name="SilverlightFaultData.Web.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
Die Beispielanwendung Service1 verwendet dieses Verhalten zu dem dann die Ausnahme in einem FaultException <exceptiondetail> automatisch konvertiert werden kann.
Der Silverlight-3-Client kann dann das e.Error-Argument in den asynchronen Abschluss-Ereignishandler überprüfen und entsprechende Aktion in den folgenden Code und in Abbildung 5 angezeigt werden:
if (e.Error != null) {
ErrorPanel.DataContext = e.Error;
if (e.Error is FaultException<ExceptionDetail>) {
var fault = e.Error as FaultException<ExceptionDetail>;
ErrorPanel.DataContext = fault;
}
}
Abbildung 5 nicht deklarierte FaultException
Nicht deklarierte Fehlern anzeigen im Rohzustand mit allen die problematischen Fehlerinformationen, die offensichtlich nicht ratsam, anzeigen, um einem Benutzer ist die Ausnahme.
Aus diesem Grund nicht empfiehlt es sich, nicht deklarierte Fehlern in einer Produktionsanwendung verwenden.
Verwalteten Ausnahmen können Informationen der internen Anwendung zu enthalten (manchmal auch vertrauliche Informationen).
Die IncludeExceptionDetailInFaults auf True festlegen sollten nur wenn einen Anwendungsfehler vorübergehend zu debuggen und nicht in Produktionsumgebungen durchgeführt werden.
Ich empfehle nachdrücklich, dass die IncludeExceptionDetailInFaults für Produktionsanwendungen auf False festgelegt ist.
Deklarierte Fehler
Deklarierten Fehlertoleranz wird erstellt, wenn der Dienstvorgang mit einem FaultContractAttribute (oder einen abgeleiteten Typ der FaultContractAttribute) ergänzt ist.
Im Gegensatz zu nicht deklarierte Fehlern sind deklarierte Fehlern gut für Produktion, wie Sie speziell eine Ausnahme-Informationen im Code in den Typ Fehlertoleranz übersetzen.
Im Web Service können Sie ein Entwickler den Fault-Typ in Code erstellen und legen Sie seine Eigenschaften Informationen, die zum Senden an Silverlight geeignet ist.
Der Fehler sollte nur mit Informationen gefüllt werden, die der Client kennen muss.
Alle vertraulicher Informationen (wie z. B. Anmeldeinformationen) sollte nicht in den Fehler an den Client gesendet werden.
Im Silverlight-Client kann ein Entwickler Code zum Suchen nach Typ und dem Benutzer mitteilen einen passenden schreiben.
Abbildung 6 zeigt den Dienstvorgang wird mit dem Attribut FaultContract mit DataFault Typ ergänzt.
Allgemeine FaultContract <typeof(ExceptionDetail)> konnte, verwendet wurden Obwohl es empfiehlt sich mit einem bestimmten benutzerdefinierten Fehlertoleranz-Typ für den Vorgang.
In diesem Fall verwendet der Vorgang DataFault, die ich in der Beispielanwendung erstellt.
Dieser Dienstvorgang schlägt fehl, da die Datenbank gefunden werden kann.
Eine Ausnahme wird ausgelöst, und dann abgefangen durch Try-Catch-Block, wobei die Ausnahme wird gelesen und Schlüsselinformationen wird in der DataFault abgelegt, bevor es ausgelöst wird.
Zu diesem Zeitpunkt wird die DataFault in einen SOAP-Fehler konvertiert und zurück an den Silverlight-Client mit dem Statuscode 200 gesendet.

Abbildung 6 erstellen einen deklarierten Fault
[OperationContract]
[FaultContract(typeof(DataFault))]
public IList<Products> DoWork()
{
try
{
var ctx = new NorthwindEFEntities();
var query = from p in ctx.Products
select p;
return query.ToList<Products>();
}
catch (Exception ex)
{
DataFault fault = new DataFault { Operation = Operation.Other, Description = ex.Message };
throw new FaultException<DataFault>(fault, "because");
}
}
Die DataFault-Klasse (siehe Abbildung 7 ) definiert eine Operation-Eigenschaft und eine Beschreibung-Eigenschaft.
Die Eigenschaften, die der Fehler enthält, werden dem Entwickler.
Die Eigenschaften sollten die Schlüsselinformationen für das Problem darstellen, damit er vom Silverlight-Client überprüft werden kann.
Der Vorgang wird auf eine benutzerdefinierte Enumeration vom Typ Vorgang (Siehe auch Abbildung 7 ) festgelegt, die den Typ des SQL-Operation angeben wird, die beim Auftreten der Ausnahme ausgeführt wurde.
Die Beschreibung sollte auf eine benutzerdefinierte Meldung und nicht auf die Ausnahmemeldung damit vertraulichen Informationen gesendet festgelegt werden.
(Die Beispielanwendung ex.Message nur zu Demonstrationszwecken verwendet.
Ich empfehlen nicht die Ausnahme Nachricht direkt an dem Silverlight-Client übergeben.) Die FaultException akzeptiert auch einen Parameter, der den Grund für die Ausnahme darstellt.
Im Beispiel ist der Grund "wegen." auf festgelegt Der Grund kann damit den Client die Ursache der Ausnahme klassifizieren verwendet werden.

Abbildung 7 DataFault-Klasse
public class DataFault
{
public Operation Operation { get; set; }
public string Description { get; set; }
}
public enum Operation
{
Select,
Insert,
Update,
Delete,
Other
}
Im Beispiel Service3 hat eine Konfiguration, dessen Endpunkt gibt an, dass die BehaviorConfiguration die SilverlightFaultBehavior-Klasse verwenden soll (übersetzt den Statuscode 500 auf 200).
Die Konfiguration ist hier dargestellt:
<service
behaviorConfiguration="SilverlightFaultData.Web.Service3Behavior"
name="SilverlightFaultData.Web.Service3">
<endpoint address=""
behaviorConfiguration="SilverlightFaultBehavior"
binding="customBinding" bindingConfiguration="silverlightBinaryBinding"
contract="SilverlightFaultData.Web.Service3" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
Wenn der Dienst, der deklarierten Fehlertoleranz verwendet, ausgeführt wird, wird der Silverlight-Client empfängt und die Fehlertoleranz lesen.
Im folgende Code wird ausgeführt, bei Abschluss des asynchronen Web Service-Vorgangs:
if (e.Error is FaultException<ServiceReference3.DataFault>)
{
var fault = e.Error as FaultException<ServiceReference3.DataFault>;
ErrorPanel.DataContext = fault;
}
Der Fehler wird geprüft ist eine FaultException des Typs DataFault.
Wenn dies der Fall ist, können Ihre einzelnen Eigenschaften Vorgang und Beschreibung untersucht werden.
Abbildung 8 zeigt die DataFault benutzerdefinierten Informationen, die direkt mit dem Benutzer angezeigt.
Abbildung 8 deklarierten Fehler überprüfen
In Produktionsanwendungen sollte eine benutzerdefinierte Fehlertoleranz Strategie Zuordnen von einigen Ausnahmen zu SOAP-Fehler entwickelt werden.
Der Schlüssel ist die Bedingungen bestimmen, unter denen Ausnahmen Fehlern zugeordnet werden sollen.
Dies hängt davon, ob die Client-Anwendung bestimmte Informationen über Fehler auf dem Server informiert werden sollten.
Umbrechen von
In diesem Artikel wird erläutert, wie Silverlight 3 Anwendungen binäre Codierung und Verwaltungsfunktionen, die Ausnahme profitieren können.
Binäre Nachrichtencodierung ist eine solide Wahl über BasicHttpBinding, wenn .NET WCF-Clients, wie Silverlight verwendet wird.
Ausnahmen enthalten häufig kritische Informationen, die in das Debuggen einer Anwendung helfen können.
In diesem Artikel gezeigt, wie Informationen zur Ausnahme in Entwicklungs- und Produktionsumgebungen Umgebungen, die mithilfe der Silverlight-3-Erweiterungen Oberfläche.
John Papa
(
Johnpapa.
NET
) ist leitender Berater und ein Fan Baseball, für die Yankees mit seiner Familie rooting Sommer Nächte anfeuert.
John, ein Silverlight-MVP, Silverlight Insider und INETA-Sprecher, hat mehrere Bücher, einschließlich seine neuesten verfasst Titel Data-Driven Services with Silverlight 2 (O' Reilly, 2009).
Er spricht oft auf Konferenzen wie VSLive!, DevConnections, und MIX.