2012-11-02 19 views
11

Dzwonię do usługi WCF z aplikacji WinRT. Usługa wymaga ustawienia niektórych nagłówków do uwierzytelnienia. Problemem jest to, że jeśli to zrobię wiele połączeń służbie jednocześnie, pojawia się następujący wyjątek:Wywołania klienta Async WCF z niestandardowymi nagłówkami: Operacja OperationContextScope jest usuwana poza kolejność

To OperationContextScope jest umieszczony poza kolejnością.

Obecny kod wygląda następująco:

public async Task<Result> CallServerAsync() 
{ 
    var address = new EndpointAddress(url); 
    var client = new AdminServiceClient(endpointConfig, address); 

    using (new OperationContextScope(client.InnerChannel)) 
    { 
     OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = GetHeader(); 

     var request = new MyRequest(...); 
     { 
      context = context, 
     }; 

     var result = await client.GetDataFromServerAsync(request); 
    } 
} 

znalazłem następujący komentarz from the docs:

Nie używaj asynchroniczne „czekają” wzór w bloku OperationContextScope. Kiedy kontynuacja występuje, może działać na innym wątku, a OperationContextScope jest specyficzny dla wątku. Jeśli chcesz wywołać "oczekuj" na wywołanie asynchroniczne, użyj go poza blokiem OperationContextScope.

Wygląda na to, że wyraźnie dzwonię do usługi nieprawidłowo. Ale jaki jest właściwy sposób?

Odpowiedz

4

Wszystko wydaje się działać całkiem dobrze z następującego kodu:

public async void TestMethod() 
{ 
    var result = await CallServerAsync(); 
} 

public Task<Result> CallServerAsync() 
{ 
    var address = new EndpointAddress(url); 
    var client = new AdminServiceClient(endpointConfig, address); 

    using (new OperationContextScope(client.InnerChannel)) 
    { 
     OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = GetHeader(); 

     var request = new MyRequest(...); 
     { 
      context = context, 
     }; 

     return client.GetDataFromServerAsync(request); 
    } 
} 
+2

To może działać, ale to będzie działać przez przypadek. Ponieważ nie oczekujesz na wywołanie GetDataFromServerAsync, przełącznik wątku nie pojawi się. Zasięg kontekstu operacji został już usunięty przed zakończeniem połączenia. Powodem, dla którego działa, jest prawdopodobnie to, że wychodzący nagłówek jest dodawany przed wewnętrznym wywołaniem. –

+0

Możesz oczekiwać, że zadanie GetDataFromServerAsync powróci zaraz po zakończeniu użycia bloku (przypisz zadanie do zmiennej). –