Ich rufe einen WCF-Dienst von einer WinRT-App. Der Dienst erfordert, dass einige Header für die Authentifizierung festgelegt sind. Das Problem ist, dass, wenn ich mehr Anrufe den Dienst tue gleichzeitig, ich die folgende Ausnahme erhalten:Async WCF-Clientaufrufe mit benutzerdefinierten Headern: Dieses OperationContextScope wird außerhalb der Reihenfolge angeordnet
Diese Operation in der falschen Reihenfolge angeordnet wird.
Der aktuelle Code sieht wie folgt aus:
Sie nicht die asynchrone „erwarten“ Muster innerhalb eines Operation Block verwenden:
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); } }
ich folgenden Kommentar from the docs gefunden. Wenn die Fortsetzung auftritt, kann es in einem anderen Thread ausgeführt werden und OperationContextScope ist threadspezifisch. Wenn Sie "aswar" für einen asynchronen Aufruf aufrufen müssen, verwenden Sie diesen außerhalb des OperationContextScope-Blocks.
So scheint es, dass ich den Dienst eindeutig falsch anrufe. Aber was ist der richtige Weg?
Dies könnte funktionieren, aber es wird durch Zufall arbeiten. Da Sie den GetDataFromServerAsync-Aufruf nicht erwarten, wird der Threadwechsel nicht auftreten. Der Kontextbereich der Operation ist bereits vor dem tatsächlichen Abschluss des Aufrufs verfügbar. Der Grund, warum es funktioniert, liegt wahrscheinlich daran, dass der ausgehende Header hinzugefügt wird, bevor der innere Aufruf intern erwartet wird. –
Sie können auf die Aufgabe warten, die GetDataFromServerAsync direkt nach dem Ende des using-Blocks zurückgibt (weisen Sie die Aufgabe einer Variablen zu). –