Host ASP.NET Web API 2 dalam Peran Pekerja Azure
oleh Mike Wasson
Tutorial ini menunjukkan cara menghosting ASP.NET Web API dalam Peran Pekerja Azure, menggunakan OWIN untuk menghost sendiri kerangka kerja API Web.
Open Web Interface for .NET (OWIN) mendefinisikan abstraksi antara server web .NET dan aplikasi web. OWIN memisahkan aplikasi web dari server, yang membuat OWIN ideal untuk menghosting sendiri aplikasi web dalam proses Anda sendiri, di luar IIS–misalnya, di dalam peran pekerja Azure.
Dalam tutorial ini, Anda akan menggunakan paket Microsoft.Owin.Host.HttpListener, yang menyediakan server HTTP yang digunakan untuk menghost sendiri aplikasi OWIN.
Versi perangkat lunak yang digunakan dalam tutorial
- Visual Studio 2013
- WEB API 2
- Azure SDK untuk .NET 2.3
Membuat Proyek Microsoft Azure
Mulai Visual Studio dengan hak istimewa administrator. Hak istimewa administrator diperlukan untuk men-debug aplikasi secara lokal, menggunakan Azure Compute Emulator.
Pada menu File , klik Baru, lalu klik Proyek. Dari Templat terinstal, di bawah Visual C#, klik Cloud lalu klik Windows Azure Cloud Service. Beri nama proyek "AzureApp" dan klik OK.
Dalam dialog Windows Azure Cloud Service Baru , klik dua kali Peran Pekerja. Biarkan nama default ("WorkerRole1"). Langkah ini menambahkan peran pekerja ke solusi. Klik OK.
Solusi Visual Studio yang dibuat berisi dua proyek:
- "AzureApp" mendefinisikan peran dan konfigurasi untuk aplikasi Azure.
- "WorkerRole1" berisi kode untuk peran pekerja.
Secara umum, aplikasi Azure dapat berisi beberapa peran, meskipun tutorial ini menggunakan satu peran.
Menambahkan Web API dan Paket OWIN
Dari menu Alat , klik Pengelola Paket NuGet, lalu klik Konsol Pengelola Paket.
Di jendela Konsol Manajer Paket, masukkan perintah berikut:
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
Menambahkan Titik Akhir HTTP
Di Penjelajah Solusi, perluas proyek AzureApp. Perluas simpul Peran, klik kanan WorkerRole1, dan pilih Properti.
Klik Titik Akhir, lalu klik Tambahkan Titik Akhir.
Di daftar dropdown Protokol , pilih "http". Di Port Publik dan Port Privat, ketik 80. Nomor port ini bisa berbeda. Port publik adalah apa yang digunakan klien ketika mereka mengirim permintaan ke peran tersebut.
Mengonfigurasi API Web untuk Self-Host
Di Penjelajah Solusi, klik kanan proyek WorkerRole1 dan pilih Tambahkan / Kelas untuk menambahkan kelas baru. Beri nama kelas Startup
.
Ganti semua kode boilerplate dalam file ini dengan yang berikut:
using Owin;
using System.Web.Http;
namespace WorkerRole1
{
class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"Default",
"{controller}/{id}",
new { id = RouteParameter.Optional });
app.UseWebApi(config);
}
}
}
Menambahkan Pengontrol API Web
Selanjutnya, tambahkan kelas pengontrol API Web. Klik kanan proyek WorkerRole1 dan pilih Tambahkan / Kelas. Beri nama kelas TestController. Ganti semua kode boilerplate dalam file ini dengan yang berikut:
using System;
using System.Net.Http;
using System.Web.Http;
namespace WorkerRole1
{
public class TestController : ApiController
{
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("Hello from OWIN!")
};
}
public HttpResponseMessage Get(int id)
{
string msg = String.Format("Hello from OWIN (id = {0})", id);
return new HttpResponseMessage()
{
Content = new StringContent(msg)
};
}
}
}
Untuk kesederhanaan, pengontrol ini hanya mendefinisikan dua metode GET yang mengembalikan teks biasa.
Memulai Host OWIN
Buka file WorkerRole.cs. Kelas ini mendefinisikan kode yang berjalan ketika peran pekerja dimulai dan dihentikan.
Tambahkan pernyataan penggunaan berikut:
using Microsoft.Owin.Hosting;
Tambahkan anggota IDisposable ke WorkerRole
kelas :
public class WorkerRole : RoleEntryPoint
{
private IDisposable _app = null;
// ....
}
OnStart
Dalam metode , tambahkan kode berikut untuk memulai host:
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
// New code:
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}",
endpoint.Protocol, endpoint.IPEndpoint);
Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri),
"Information");
_app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
return base.OnStart();
}
Metode WebApp.Start memulai host OWIN. Nama Startup
kelas adalah parameter jenis untuk metode . Berdasarkan konvensi, host akan memanggil Configure
metode kelas ini.
Ambil alih OnStop
untuk membuang instans _app :
public override void OnStop()
{
if (_app != null)
{
_app.Dispose();
}
base.OnStop();
}
Berikut adalah kode lengkap untuk WorkerRole.cs:
using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;
namespace WorkerRole1
{
public class WorkerRole : RoleEntryPoint
{
private IDisposable _app = null;
public override void Run()
{
Trace.TraceInformation("WebApiRole entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.TraceInformation("Working", "Information");
}
}
public override bool OnStart()
{
ServicePointManager.DefaultConnectionLimit = 12;
var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
string baseUri = String.Format("{0}://{1}",
endpoint.Protocol, endpoint.IPEndpoint);
Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri),
"Information");
_app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
return base.OnStart();
}
public override void OnStop()
{
if (_app != null)
{
_app.Dispose();
}
base.OnStop();
}
}
}
Buat solusi, dan tekan F5 untuk menjalankan aplikasi secara lokal di Azure Compute Emulator. Bergantung pada pengaturan firewall, Anda mungkin perlu mengizinkan emulator melalui firewall Anda.
Catatan
Jika Anda mendapatkan pengecualian seperti berikut ini, silakan lihat posting blog ini untuk solusinya. "Tidak dapat memuat file atau rakitan 'Microsoft.Owin, Version=2.0.2.0, Culture=netral, PublicKeyToken=31bf3856ad364e35' atau salah satu dependensinya. Definisi manifes assembly yang terletak tidak cocok dengan referensi assembly. (Pengecualian dari HRESULT: 0x80131040)"
Emulator komputasi menetapkan alamat IP lokal ke titik akhir. Anda dapat menemukan alamat IP dengan melihat UI Compute Emulator. Klik kanan ikon emulator di area pemberitahuan bilah tugas, dan pilih Tampilkan UI Emulator Komputasi.
Temukan alamat IP di bawah Penyebaran Layanan, penyebaran [id], Detail Layanan. Buka browser web dan navigasi ke http:// address/test/1, di mana alamat adalah alamat IP yang ditetapkan oleh emulator komputasi; misalnya, http://127.0.0.1:80/test/1
. Anda akan melihat respons dari pengontrol API Web:
Sebarkan ke Azure
Untuk langkah ini, Anda harus memiliki akun Azure. Jika Anda belum memilikinya, Anda dapat membuat akun uji coba gratis hanya dalam beberapa menit. Untuk detailnya, lihat Uji Coba Gratis Microsoft Azure.
Di Penjelajah Solusi, klik kanan proyek AzureApp. Pilih Terbitkan.
Jika Anda tidak masuk ke akun Azure Anda, klik Masuk.
Setelah Anda masuk, pilih langganan dan klik Berikutnya.
Masukkan nama untuk layanan awan dan pilih wilayah. Klik Buat.
Klik Terbitkan.
Mengonfigurasi nama domain kustom untuk Azure Cloud Service (klasik)