過去にいくつかのASP.NET MVCアプリケーションを作成しましたが、WebAPIを使用したことはありません。私は、通常のMVCコントローラーではなく、WebAPIを介して単純なCRUD処理を行う単純なMVC 4アプリをどのように作成できるのか疑問に思っています。秘Theは、WebAPIを別のソリューションにする必要があるということです(実際、別のサーバー/ドメインに配置することもできます)。
それ、どうやったら出来るの?私は何が欠けていますか? WebAPIのサーバーを指すようにルートを設定するだけの問題ですか? MVCアプリケーションを使用してWebAPIを使用する方法を示したすべての例は、WebAPIがMVCアプリケーションに「組み込まれている」、または少なくとも同じサーバー上にあると想定しているようです。
ああ、明確にするために、jQueryを使用したAjax呼び出しについては話していません... MVCアプリケーションのコントローラーは、WebAPIを使用してデータを取得/配置する必要があります。
新しい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操作の効果を確認するには、以下の投稿をご覧ください。
回答ありがとうございます。 @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);
}
}
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>
http://restsharp.org/ はあなたの質問に対する答えです。現在、同様の構造を持つアプリケーションで使用しています。
しかし、より一般的には、WebAPIを使用するのは、処理方法のデータの投稿と要求だけです。標準のWebRequestとJavascriptSerializerを使用することもできます。
乾杯。
この場合、 HttpClient を使用して、コントローラーからWeb APIを使用できます。