web-dev-qa-db-ja.com

リモートWebAPIを呼び出すASP.NET MVC 4アプリケーション

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

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

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

59
Glenn Arndt

新しいHttpClientを使用して、HTTP APIを使用する必要があります。さらに、呼び出しを完全に非同期にすることをお勧めします。 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アプリケーションでのタスクベースの非同期プログラミングに関する私の見解

81
tugberk

回答ありがとうございます。 @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);
    }
}
18
Glenn Arndt

WCFを使用してサービスを利用できます。そのようです:

[ServiceContract]
public interface IDogService
{
    [OperationContract]
    [WebGet(UriTemplate = "/api/dog")]
    IEnumerable<Dog> List();
}

public class DogServiceClient : ClientBase<IDogService>, IDogService
{
    public DogServiceClient(string endpointConfigurationName) : base(endpointConfigurationName)
    {
    }

    public IEnumerable<Dog> List()
    {
        return Channel.List();
    }
}

そして、あなたはあなたのコントローラーでそれを消費することができます:

public class HomeController : Controller
{
    public HomeController()
    {
    }

    public ActionResult List()
    {
        var service = new DogServiceClient("YourEndpoint");
        var dogs = service.List();
        return View(dogs);
    }
}

そして、web.configにエンドポイントの構成を配置します。

<system.serviceModel>
  <client>
    <endpoint address="http://localhost/DogService" binding="webHttpBinding"
    bindingConfiguration="" behaviorConfiguration="DogServiceConfig" 
    contract="IDogService" name="YourEndpoint" />
  </client>
  <behaviors>
    <endpointBehaviors>
      <behavior name="DogServiceConfig">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>
10
peco

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

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

乾杯。

1
Onur Topal

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

1
cuongle