2014-02-19 1 views
7

Ich versuche, alle Aufrufe von Webservices in eine Portable Class Library (PCL) zu verschieben, die ich gerade erstellt habe, um meinen Code zu organisieren und wiederzuverwenden. Die Frameworks, auf die ich ausgerichtet bin, sind .NET für Windows Store-Apps. .NET Framework 4.5; Silverlight 4 und höher und WP7 und höher.Nachrichtenkopfzeilen, die über Webservice-Aufrufe in tragbaren Bibliotheken (PCL) gesendet werden

In meinem Win RT-Projekt habe ich die Nachrichtenheader eingerichtet, indem ich die IClientMessageInspector-Schnittstelle implementiert habe, die im Namespace System.ServiceModel.Dispatcher verfügbar ist. Aber auf meinem PCL-Projekt sind diese Schnittstelle sowie System.ServiceModel.Description.IEndpointBehavior nicht verfügbar.

Also muss ich herausfinden, wie eine Nachricht Header/Service-Header an meine Service-Anrufe von einem PCL-Projekt mit diesen gezielten Frameworks anhängen. Hat jemand Erfahrungen und/oder Vorschläge, die ich ausprobieren sollte?

aktualisiert

Gerade für weitere Informationen hinzufügen, ich habe versucht nun ein WP8-Projekt zu erstellen und festgestellt, dass diese Schnittstellen für sie entweder nicht verfügbar sind. Daher sind IClientMessageInspector und IEndpointBehavior wahrscheinlich nicht für mein PCL-Projekt verfügbar, da es auf WP8 abzielt, das sie selbst vermisst.

+0

Welche Technologie verwenden Sie, um den Service für Kunden zu bedienen? – Justin

+0

@Justin nehme an, dass es .Net 4.5 auf einem Windows Server ist. Warum wäre das wichtig? –

+0

Übrigens, ich bin daran interessiert, dies in einer PCL zu implementieren, die auch auf Xamarin.Android zielt, nicht nur auf Windows-Plattformen. Ich kann das umgehen, indem ich die Logik abstrahiere, wie ich es bei allem anderen plattformspezifisch gemacht habe, aber eine generische plattformunabhängige Lösung wäre besser. –

Antwort

1

Sie sollten die OperationContext den aktuellen Client-Kanal Rahmen der Lage sein, mit dem Sie arbeiten wollen:

using(var scope = new OperationContextScope(_client.InnerChannel)){ 
    //More to come 
} 

Nun, da Sie den Vorgang Kontext für den Client-Kanal erstellt haben, können Sie ausgehende Nachrichten-Header hinzufügen:

using(var scope = new OperationContextScope(_client.InnerChannel)){ 
    var header = MessageHeader.CreateHeader("x-client-type", "http://www.myapp.com", "WP8"); 

    OperationContext.Current.OutgoingMessageHeaders.Add(header); 

    //Send message to server 
} 

Danach sollten Sie in der Lage sein, den Header mit der IncomingMessageHeaders Eigenschaft der OperationContext.Current zu bekommen.

Dies sind alles Kernstücke von WCF-Diensten, daher sollte es (hoffentlich) verfügbar sein.

Mono unterstützt WCF-Dienste, aber Sie müssen überprüfen, was sie implementiert haben. EG: Vielleicht haben sie nicht MessageHeader.Create und Sie müssten stattdessen var header = new MessageHeader<string>("x-client-type"); und var untypedHeader = header.GetUntypedHeader("x-client-type", "http://www.myapp.com"); verwenden, um Ihre Kopfzeile zu erstellen.

Verwandte Themen