2008-11-10 2 views
5

Ich versuche, eine Server-Anwendung zu erhalten, um einige Statusinformationen mit WCF verfügbar zu machen. Insbesondere bin ich nach WCF-Dienste mit RESTful "API" verwenden. Ich schlage etwas von einer Wand, wenn es um Konsum die REST-API von einer Silverlight- app/Seite, die ich als eine zusätzliche Art von Client ...Was ist der portabelste Weg, um einen Silverlight & Regular .NET REST-Client zu erstellen?

I Bisher haben will kommt schon erfolgreich in eine Status-Schnittstelle zu definieren:

public static class StatusUriTemplates 
{ 
    public const string Status = "/current-status"; 
    public const string StatusJson = "/current-status/json"; 
    public const string StatusXml = "/current-status/xml"; 
} 
[ServiceContract] 
public interface IStatusService 
{ 
    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = StatusUriTemplates.StatusJson)] 
    StatusResultSet GetProgressAsJson(); 

    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = StatusUriTemplates.StatusXml)] 
    StatusResultSet GetProgressAsXml(); 

    [OperationContract] 
    [WebGet(UriTemplate = StatusUriTemplates.Status)] 
    StatusResultSet GetProgress(); 
} 

es in dem Server-Implementierung:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class ServerStatusService : IStatusService 
    { 
    public StatusResultSet GetProgressAsJson() 
    { return GetProgress(); } 

    public StatusResultSet GetProgressAsXml() 
    { return GetProgress(); } 

    public StatusResultSet GetProgress() 
    { 
     return StatusResultSet.Empty; 
    } 
    } 

es von meinem Code zur Laufzeit freilegen:

var service = new ServerStatusService(); 
    var binding = new WebHttpBinding(); 
    var behavior = new WebHttpBehavior(); 

    var host = new WebServiceHost(service, new Uri("http://localhost:8000/server")); 
    host.AddServiceEndpoint(typeof(IStatusService), binding, "status"); 
    host.Open(); 

Ich habe sogar erfolgreich den Dienst von einer .NET-Konsole/winfoems/WPF-Anwendung mit etwas entlang der Linie dieses mit raubend:

var cf = new WebChannelFactory<IStatusService>(new Uri("http://localhost:8000/server/status")); 
    var ss = cf.CreateChannel(); 
    Console.WriteLine(ss.GetProgress().TimeStamp); 

Die „Wand“ Ich bin schlagen ist, dass es ist KEINE WebChannelFactory für SliverLight.

Zeitraum.

Dies bedeutet, dass, wenn es um Silverlight-Code kommt, meine Optionen sind:

  • schreiben hässlich Code WebClient, was letztlich bedeutet, dass ich haben zwei Sätze von Code zu aktualisieren, wenn ich eine Änderung haben zu meiner API
  • Verwenden SOAP/WS für die WebService und halten den Dienstverweis von Visual Studio
Aktualisierung

Gibt es eine Möglichkeit, die "saubere" Implementierung mit WebChannelFactory in SilverLight beizubehalten? Vielleicht eine Public Domain/Open Source WebChannelFactory für SilverLight?

Jede Hilfe mit diesem wird sehr geschätzt werden!

+0

Irgendein Fortschritt auf diesem? – andrecarlucci

Antwort

1

Ich hasse fast vorschlagen, aber würden Sie sich mit reimplementing the WebChannelFactory<T> class wohl fühlen?

Von einem flüchtigen Blick durch die Silverlight-API sieht es so aus, als ob Sie von Microsoft nicht viel Hilfe von Anfang an erhalten. Sie müssten eine Channel-Klasse und eine Factory neu implementieren.

Vielleicht eine andere Möglichkeit, den Kanal zu erstellen und sich vom plattformspezifischen Code zu isolieren, ist eine benutzerdefinierte Implementierung davon zu erstellen? Genauer gesagt, Sie erstellen eine weitere Factory-Klasse, und die Factory-Klasse ruft entweder die WebChannelFactory auf, wenn sie verfügbar ist, oder geht durch die Ringe, um sie für Sie einzurichten.

Entschuldigung, ich habe keinen tieferen Vorschlag. :)

+0

Ich denke, ich werde Ihrem Vorschlag folgen, die Fabrikklasse wieder einzuführen. Ich denke, ich werde etwas wie LinFu verwenden, um all das schwere Heben zu tun. Ich muss nur sehen, ob LinFu auf Silverlight – damageboy

+0

arbeitet @damageboy irgendwelche Fortschritte dabei? – andrecarlucci

1

Wenn dies ein einfacher Xml-REST-Service ist, verwenden Sie den WebClient in Silverlight, um den XML-Code mithilfe von Linq to XML zu erfassen. Ich weiß, du hast gesagt, es ist chaotisch, aber alles hängt davon ab, wie du es ansiehst. Wenn Sie Ihre Service-Schnittstelle jederzeit ändern, müssen Sie Ihren Code an mehreren Stellen aktualisieren. So ist es halt.

Um dies zu tun, müssen Sie die Daten asynchron vom WebClient erfassen und dann mit LINQ to XML analysieren.

Zeit Heuer hat ein gutes Beispiel auf seiner Website: http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Im Wesentlichen sieht es wie folgt aus:

WebClient rest = new WebClient(); 
rest.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rest_DownloadStringCompleted); 
rest.DownloadStringAsync(new Uri("http://example.org/current-status/xml")); 

Dann in Ihrem "rest_DownloadStringCompleted" Sie die Zeichenfolge als XML analysieren würde. Wie so:

string data = e.Result; 
string url = string.Empty; 

XDocument doc = XDocument.Parse(e.Result); 
var myResults = from results in doc.Descendants("myXmlElement") ... blah blah blah 

Ich habe die gleiche Sache mit home grown REST Service von WCF und Silverlight getan und es hat super funktioniert.

+0

Ich mag diese Art von Lösung nicht, weil es eine Abhängigkeit zwischen dem Client und dem Server erstellt hat, die nicht in Code ausgedrückt wird. Wenn ich die Art, wie mein Dienst funktioniert, umgestalten/ändern würde, müsste ich im Grunde sicherstellen, dass Änderungen am Server + Client vorgenommen wurden. Der Proxy beseitigt diese Notwendigkeit. – damageboy

1

Bisher habe ich einige Alternativen zu WebChannelFactory gefunden, um REST-Dienste in Silverlight zu nutzen. Sie haben alle Lob in Foren und Blogs gesehen, aber ich muss sie noch nie selbst ausprobieren. Ich glaube, dass alle drei Generics verwenden, um Anfrageantworten in CLR-Objekte leicht zu deserialisieren.

ich in Richtung RestSharp bin Neigung, weil seine Beispiele für mich einfach und erweiterbar aussehen.

Verwandte Themen