2011-10-04 51 views
5

Chúng tôi đang sử dụng các dịch vụ wcf trên máng ứng dụng Silverlight tạo proxy bằng cách sử dụng ChanellFacotry.Gọi đồng bộ các phương thức hợp đồng vận hành WCF không đồng bộ trên silverlight

Hợp đồng vận hành và dữ liệu được tiếp xúc với lắp ráp máng bạc, bao gồm các tệp được chia sẻ từ serverside Dữ liệu và hoạt động của hợp đồng libriary. (omg Tôi hy vọng bạn hiểu những gì tôi đang nói).

Vì vậy, máy chủ và ứng dụng khách đang sử dụng cùng một hợp đồng vận hành và dữ liệu.

Silverlight wcf client lib có giới hạn không thể gọi các phương thức wcf một cách đồng bộ, như bạn biết, do đó, tệp hợp đồng hoạt động được chia sẻ phải hiển thị các phiên bản asyn của mỗi thao tác.

Viết dịch vụ WCF không đồng bộ sẽ có ý nghĩa nếu chúng không chứa hoạt động chặn, nhưng khi chúng tôi đang sử dụng EF, asyncrhony đạt được bằng cách ủy nhiệm công việc chặn cho nhóm luồng. Đây là những gì WCF làm cho các phương thức đồng bộ. Và điều này khiến tôi muốn xé mắt ra (# @%! ^%! @%).

Nhà tư vấn dự án của chúng tôi có quyền không cho phép tạo proxy động trên máy khách để gọi các phương thức hợp đồng hoạt động đồng bộ (google Yevhen Bobrov Servelat Pieces nếu bạn quan tâm). Vì vậy, chúng ta phải viết các triển khai senseles của các phương thức async trên serverside, mà không có bất kỳ sự tăng hiệu năng nào (chặn các cuộc gọi khi bạn nhớ).

Có thể gọi phương thức đồng bộ dịch vụ web wcf từ silverlight bằng hợp đồng dữ liệu của nó không?

Bạn đã từng gặp phải vấn đề này trước đây chưa, nếu bạn giải quyết nó như thế nào?

Tại thời điểm này, tôi mong muốn tạo các hợp đồng không đồng bộ cho phía máy khách, chỉ sử dụng hợp đồng serverside làm nguồn chuyển đổi. Có lẽ có một số mẫu t4 mà độc đáo có thể làm điều đó cho tôi?

Xin lỗi vì các bức tường của văn bản, chỉ cần trộn một số mã cho câu hỏi của tôi, đây là cách thực hiện hợp đồng async nhìn vào momment:

/// <summary> 
    /// Subscribes to users of the specified organization. 
    /// </summary> 
    /// <param name="organizationId">The organization id.</param> 
    public void Unsubscribe(int organizationId) 
    { 
     var clientId = this.OperationContext.GetClientId(); 
     if (string.IsNullOrEmpty(clientId)) 
     { 
      return; 
     } 

     this.InternalUnsubscribe(organizationId, clientId); 
    } 

    /// <summary> 
    /// Begins an asynchronous operation to Unsubscribe. 
    /// </summary> 
    /// <param name="organizationId">The organization id.</param> 
    /// <param name="callback">The callback.</param> 
    /// <param name="passThroughData">The pass through data.</param> 
    /// <returns> 
    /// An implementation of <see cref="IAsyncResult"/> that provides access to the state or result of the operation. 
    /// </returns> 
    public IAsyncResult BeginUnsubscribe(int organizationId, AsyncCallback callback, object passThroughData) 
    { 
     var clientId = this.OperationContext.GetClientId(); 
     if (string.IsNullOrEmpty(clientId)) 
     { 
      return null; 
     } 

     var asyncResult = new VoidAsyncResult(callback, passThroughData); 
     Task.Factory.StartNew(() => 
      { 
       try 
       { 
        this.InternalUnsubscribe(organizationId, clientId); 
        asyncResult.SetAsCompleted(false); 
       } 
       catch (Exception ex) 
       { 
        asyncResult.SetAsCompleted(ex, false); 
       } 
      }); 
     return asyncResult; 
    } 

    /// <summary> 
    /// Ends an existing asynchronous operation to Unsubscribe. 
    /// </summary> 
    /// <param name="result">The <see cref="IAsyncResult"/> provided by the BeginUnsubscribe operation.</param> 
    public void EndUnsubscribe(IAsyncResult result) 
    { 
     var response = result as VoidAsyncResult; 
     if (response != null) 
     { 
      response.EndInvoke(); 
     } 
    } 

Trả lời

3

Bạn không cần phải viết các dịch vụ WCF là Async . Bạn đơn giản cần tạo ServiceContract cho dịch vụ của bạn để định nghĩa các phương thức Async. Dưới đây là ví dụ nhanh

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    int Foo(string input); 
} 

//tell wcf that this contract applies to IMyService 
[ServiceContract(Name = "IMyService")] 
public interface IMyServiceAsync 
{ 
    //setting AsyncPattern = true allows WCF to map the async methods to the sync ones. 
    [OperationContract(AsyncPattern = true)] 
    IAsyncResult BeginFoo(string input, AsyncCallback callback, object asyncState); 

    int EndFoo(IAsyncResult result}; 
} 

// you only need to implement the sync contract 
public class MyService : IMyService 
{ 
    public int Foo(string input) 
    { 
     return input.Length; 
    } 
} 

Bây giờ hãy sử dụng IMyServiceAsync với ChannelFactory của bạn và mọi thứ sẽ hoạt động.

+0

Cảm ơn bạn, tôi vừa mới tìm thấy một mẫu t4 có thể thực hiện việc này, chuyển nó ra ngay bây giờ. – v00d00

+0

Hãy cho tôi biết cách hoạt động của nó. Tôi đã có ý nghĩa để tìm t4 để làm điều này nhưng không có thời gian. – cadrell0

+0

Lỗi của nó, sẽ cố gắng xác định tên hoạt động rõ ràng – v00d00

Các vấn đề liên quan