3

WCF WebApi サービスに関する開発者仲間の意見を知りたいです。

N 層アプリケーションでは、複数のサービス レイヤーを使用できます。外部サービスからのデータを使用するサービスを持つことができます。そのシナリオでは、WCF 4.0 を使用して Async Rest サービスを作成する価値があります。

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/セルフホスティングでそれらをホストする方法

提案やコメントをお待ちしております。

4

2 に答える 2

8


そうですね、最新の WCF WebAPI (プレビュー 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");
    }
于 2012-01-22T06:43:53.013 に答える
2

WCF Web API には完全に非同期の HttpClient 実装が付属しており、IIS でホストすることも、完全に sefhost することもできます。

非同期 REST の「サービス」シナリオについては、「Slow REST」をお読みください。

于 2012-01-21T14:02:09.547 に答える