Асинхронные REST-сервисы с использованием WCF WebApi - PullRequest
3 голосов
/ 21 января 2012

Я хочу узнать мнение ваших коллег-разработчиков в отношении сервисов WCF WebApi.

В приложении N-уровня мы можем иметь несколько уровней сервисов.У нас могут быть сервисы, использующие данные от внешних сервисов.В этом сценарии стоит создать Async Rest Services с использованием WCF 4.0.

public interface IService
{
   [OperationContractAttribute(AsyncPattern = true)]
   IAsyncResult BeginGetStock(string code, AsyncCallback callback, object asyncState);
    //Note: There is no OperationContractAttribute for the end method.
    string EndGetStock(IAsyncResult result); 
}

Но с выпуском WCF WebApi этот подход все еще необходим?создать асинхронные сервисы?

Как разместить их в IIS / WAS / Self Hosting

с нетерпением ждем предложений и комментариев.

Ответы [ 2 ]

8 голосов
/ 22 января 2012

Ну, что я чувствую, чтобы создавать асинхронные операции в последних веб-интерфейсах WCF (превью 6), я все еще могу использовать тот же шаблон (начало / конец), но я также могу использовать модель программирования задач для создания асинхронных операций, что очень многопроще.Один пример асинхронной операции, написанной с использованием модели задачи, показан ниже.

    [WebGet]
    public Task<Aggregate> Aggregation()
    {
        // Create an HttpClient (we could also reuse an existing one)
        HttpClient client = new HttpClient();

        // Submit GET requests for contacts and orders
        Task<List<Contact>> contactsTask = client.GetAsync(backendAddress + "/contacts").ContinueWith<Task<List<Contact>>>((responseTask) =>
            {
                return responseTask.Result.Content.ReadAsAsync<List<Contact>>();
            }).Unwrap();
        Task<List<Order>> ordersTask = client.GetAsync(backendAddress + "/orders").ContinueWith<Task<List<Order>>>((responseTask) =>
            {
                return responseTask.Result.Content.ReadAsAsync<List<Order>>();
            }).Unwrap();

        // Wait for both requests to complete
        return Task.Factory.ContinueWhenAll(new Task[] { contactsTask, ordersTask },
            (completedTasks) =>
            {
                client.Dispose();
                Aggregate aggregate = new Aggregate() 
                { 
                    Contacts = contactsTask.Result,
                    Orders = ordersTask.Result
                };

                return aggregate;
            });
    }

    [WebGet(UriTemplate = "contacts")]
    public Task<HttpResponseMessage> Contacts()
    {
        // Create an HttpClient (we could also reuse an existing one)
        HttpClient client = new HttpClient();

        // Submit GET requests for contacts and return task directly
        return client.GetAsync(backendAddress + "/contacts");
    }
2 голосов
/ 21 января 2012

WCF Web API поставляется с полностью асинхронной реализацией HttpClient, и вы можете размещать в IIS, а также полностью в sefhost.

Для сценария асинхронного REST "обслуживания", пожалуйста, прочитайте " Медленный REST "

...