61

過去にいくつかの ASP.NET MVC アプリケーションを作成しましたが、WebAPI を使用したことはありません。通常の MVC コントローラーではなく、WebAPI を介して単純な CRUD を実行する単純な MVC 4 アプリをどのように作成できるのか疑問に思っています。秘訣は、WebAPI は別のソリューションであるべきだということです (そして、実際には、別のサーバー/ドメイン上にある可能性が非常に高いです)。

それ、どうやったら出来るの?私は何が欠けていますか?WebAPI のサーバーを指すようにルートを設定するだけですか? MVC アプリケーションを使用して WebAPI を使用する方法を示す私が見つけたすべての例は、WebAPI が MVC アプリケーションに「組み込まれている」か、少なくとも同じサーバー上にあると想定しているようです。

ああ、明確にするために、jQuery を使用した Ajax 呼び出しについて話しているのではありません...つまり、MVC アプリケーションのコントローラーは WebAPI を使用してデータを取得/配置する必要があります。

4

5 に答える 5

82

HTTP API を使用するには、新しい HttpClient を使用する必要があります。さらに、呼び出しを完全に非同期にすることをお勧めします。ASP.NET MVC コントローラー アクションはタスク ベースの非同期プログラミング モデルをサポートしているため、非常に強力で簡単です。

これは非常に単純化された例です。次のコードは、サンプル リクエストのヘルパー クラスです。

public class CarRESTService {

    readonly string uri = "http://localhost:2236/api/cars";

    public async Task<List<Car>> GetCarsAsync() {

        using (HttpClient httpClient = new HttpClient()) {

            return JsonConvert.DeserializeObject<List<Car>>(
                await httpClient.GetStringAsync(uri)    
            );
        }
    }
}

次に、以下のように、MVC コントローラーを介して非同期的にそれを消費できます。

public class HomeController : Controller {

    private CarRESTService service = new CarRESTService();

    public async Task<ActionResult> Index() {

        return View("index",
            await service.GetCarsAsync()
        );
    }
}

以下の投稿を見て、ASP.NET MVC での非同期 I/O 操作の効果を確認できます。

C# 5.0 および ASP.NET MVC Web アプリケーションでのタスクベースの非同期プログラミングに関する私の見解

于 2012-11-03T06:25:21.273 に答える
18

回答ありがとうございます。@tugberk は私を正しい道に導いてくれたと思います。これは私のために働いた...

私の CarsRESTService ヘルパーの場合:

public class CarsRESTService
{
    readonly string baseUri = "http://localhost:9661/api/cars/";

    public List<Car> GetCars()
    {
        string uri = baseUri;
        using (HttpClient httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<List<Car>>(response.Result).Result;
        }
    }

    public Car GetCarById(int id)
    {
        string uri = baseUri + id;
        using (HttpClient httpClient = new HttpClient())
        {
            Task<String> response = httpClient.GetStringAsync(uri);
            return JsonConvert.DeserializeObjectAsync<Car>(response.Result).Result;
        }
    }
}

次に、CarsController.cs の場合:

public class CarsController : Controller
{
    private CarsRESTService carsService = new CarsRESTService();

    //
    // GET: /Cars/

    public ActionResult Index()
    {
        return View(carsService.GetCars());
    }

    //
    // GET: /Cars/Details/5

    public ActionResult Details(int id = 0)
    {
        Car car = carsService.GetCarById(id);

        if (car == null)
        {
            return HttpNotFound();
        }
        return View(car);
    }
}
于 2012-11-05T18:50:14.037 に答える
1

この場合、HttpClientを使用して、コントローラーから Web API を使用できます。

于 2012-11-03T03:36:34.380 に答える
1

http://restsharp.org/は、あなたの質問に対する答えです。現在、同様の構造を持つアプリケーションで使用しています。

しかし、より一般的に WebAPI を使用するのは、データを投稿して要求するだけであり、処理方法はあなた次第です。標準の WebRequest と JavascriptSerializer を使用することもできます。

乾杯。

于 2012-11-02T17:47:14.183 に答える