2014-06-05 28 views
5

Bieżąca konfiguracja: Klient Silverlight zużywający regularne usługi WCF przy użyciu klas RIA i wygenerowanych referencji serwisowych.Możliwość korzystania z usługi WCF w Silverlight przez fabrykę kanałów przy użyciu przenośnej biblioteki klas?

Cel: Zamień odniesienia do usług i klasy RIA na channel factories i Portable Class Library (PCL). (Cel XY: pozbyć kodu wygenerowanego.)

Podejście So Far:

Pierwsza część to - używając fabryki kanału - jest prosta i dobrze udokumentowane. Zasadniczo usługa WCF pozostaje tak jak jest, z zastrzeżeniem, że ServiceContract musi być zdefiniowany na interfejsie. Następnie na kliencie, który utworzysz ChannelFactory<IMyService>, podaj adres URL usługi, a serwer proxy jest tworzony jak magia (bez potrzeby odwoływania się do usługi).

Istnieje zmarszczka z Silverlight, a mianowicie, że musisz użyć kompilacji warunkowej, aby zdefiniować kontrakty operacji asynchronicznych. (To będzie ważne w momencie, gdy próbuję przenieść umowę operację PCL). Tak więc umowa usługa będzie wyglądać następująco:

[ServiceContract] 
public interface IMyService 
{ 
#if SILVERLIGHT 
    [OperationContract(AsyncPattern = true)] 
    IAsyncResult BeginGetAString(AsyncCallback callback, object state); 
    string EndGetAString(IAsyncResult result); 
#else 
    [OperationContract] 
    string GetAString(); 
#endif 
} 

pamiętać, że jest to (podobno) niezbędne do wykluczenia synchroniczne operacja z kompilacji Silverlight, jak wyżej. W przeciwnym razie połączenie z numerem ChannelFactory.CreateChannel powoduje:

Kontrakt "IMyService" zawiera operacje synchroniczne, które nie są obsługiwane w Silverlight. Podziel operacje na części "Rozpocznij" i "Zakończ" i ustaw właściwość AsyncPattern w obiekcie OperationContractAttribute na "true". Pamiętaj, że nie musisz wprowadzać tej samej zmiany na serwerze.

Jak dotąd tak dobrze. Następnym krokiem jest przeniesienie kodu udostępnianego między klientem a serwerem z plików klasy .shared RIA do PCL. W przypadku klas DataContract działa to doskonale - ale próba przeniesienia klasy OperationContract stanowi problem. Podejście ChannelFactory Silverlight wymaga warunkowej kompilacji definicji metody synchronicznej, jak wyżej, co (jak rozumiem) nie jest możliwe w PCL.

Pytanie:

Jaki jest najprostszy sposób (jeśli w ogóle), aby uzyskać to do pracy, krótki porzucenia podejścia fabryki kanału lub utrzymania projekt RIA? Na przykład, czy istnieje sposób, aby powiedzieć Silverlight, aby po prostu zignorować operacje synchroniczne, zamiast rzucać błąd? Lub w jakiś sposób, aby w jakiś sposób wykluczyć synchroniczną definicję dla PCL ukierunkowanego na Silverlight (na przykład, być może konstrukcja warunkowa)?

Odpowiedz

2

Czy widziałeś to post. W tym artykule pokażemy, jak konsumować zwykłe usługi WCF w Silverlight bez potrzeby statycznego generowania kodu dla proxy usługi (a.k.a. Kreator VS Add Service Reference).

+0

Wow, dziękuję, to wygląda obiecująco. Postaram się, żeby działało ... – McGarnagle

+0

Tak, zasadniczo, zamiast używać kompilacji warunkowej '#if SILVERLIGHT', wystarczy użyć dwóch oddzielnych klas i użyć asynchronicznej na kliencie. – McGarnagle

+0

Część 2 tego postu to wycieczka de force ... – McGarnagle