2012-11-02 8 views
11

Tôi đang gọi một dịch vụ WCF từ một ứng dụng WinRT. Dịch vụ yêu cầu một số tiêu đề được đặt để xác thực. Vấn đề là nếu tôi làm nhiều cuộc gọi với dịch vụ đồng thời, tôi nhận được ngoại lệ sau đây:Async WCF khách hàng cuộc gọi với các tiêu đề tùy chỉnh: Điều này OperationContextScope đang được xử lý ra khỏi trật tự

OperationContextScope này đã được xử lý ra khỏi trật tự.

Mã hiện trông giống như sau:

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); 
    } 
} 

tôi tìm thấy những nhận xét sau đây from the docs:

Không sử dụng đồng bộ “chờ đợi” mô hình trong một khối OperationContextScope. Khi sự tiếp tục xảy ra, nó có thể chạy trên một luồng khác và OperationContextScope là một chuỗi cụ thể. Nếu bạn cần gọi “đang chờ” cho một cuộc gọi không đồng bộ, hãy sử dụng nó bên ngoài khối OperationContextScope.

Vì vậy, có vẻ như tôi đang gọi dịch vụ không chính xác rõ ràng. Nhưng cách chính xác là gì?

Trả lời

4

Tất cả mọi thứ dường như làm việc khá tốt với đoạn mã sau:

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

này có thể làm việc, nhưng nó sẽ hoạt động bằng cách trùng hợp ngẫu nhiên. Bởi vì bạn không chờ đợi cuộc gọi GetDataFromServerAsync, luồng-chuyển đổi sẽ không xảy ra. Phạm vi bối cảnh của hoạt động đã được xử lý trước khi cuộc gọi thực sự hoàn thành. Lý do nó hoạt động có lẽ vì tiêu đề gửi đi được thêm trước khi cuộc gọi bên trong đang chờ nội bộ. –

+0

Bạn có thể đợi nhiệm vụ GetDataFromServerAsync trả về ngay sau khi kết thúc khối sử dụng (gán nhiệm vụ cho một biến). –