Hostowanie ASP.NET internetowego interfejsu API 2 w roli procesu roboczego platformy Azure

Autor: Mike Wasson

W tym samouczku pokazano, jak hostować ASP.NET internetowy interfejs API w roli procesu roboczego platformy Azure przy użyciu interfejsu OWIN do samodzielnego hostowania struktury internetowego interfejsu API.

Open Web Interface for .NET (OWIN) definiuje abstrakcję między serwerami internetowymi platformy .NET i aplikacjami internetowymi. OWIN rozdziela aplikację internetową z serwera, co sprawia, że OWIN idealnie nadaje się do samodzielnego hostowania aplikacji internetowej we własnym procesie, na przykład poza usługami IIS, na przykład w ramach roli procesu roboczego platformy Azure.

W tym samouczku użyjesz pakietu Microsoft.Owin.Host.HttpListener, który udostępnia serwer HTTP używany do samodzielnego hostowania aplikacji OWIN.

Wersje oprogramowania używane w samouczku

Tworzenie projektu platformy Microsoft Azure

Uruchom program Visual Studio z uprawnieniami administratora. Uprawnienia administratora są wymagane do lokalnego debugowania aplikacji przy użyciu emulatora usługi Azure Compute.

W menu Plik kliknij pozycję Nowy, a następnie kliknij pozycję Projekt. W obszarze Zainstalowane szablony w obszarze Visual C# kliknij pozycję Chmura , a następnie kliknij pozycję Usługa w chmurze platformy Microsoft Azure. Nadaj projektowi nazwę "AzureApp" i kliknij przycisk OK.

Zrzut ekranu przedstawiający okno dialogowe

W oknie dialogowym Nowa usługa w chmurze platformy Windows Azure kliknij dwukrotnie pozycję Rola procesu roboczego. Pozostaw nazwę domyślną ("WorkerRole1"). Ten krok powoduje dodanie roli procesu roboczego do rozwiązania. Kliknij przycisk OK.

Zrzut ekranu przedstawiający okno dialogowe

Utworzone rozwiązanie programu Visual Studio zawiera dwa projekty:

  • "AzureApp" definiuje role i konfigurację aplikacji platformy Azure.
  • Element "WorkerRole1" zawiera kod roli procesu roboczego.

Ogólnie rzecz biorąc, aplikacja platformy Azure może zawierać wiele ról, chociaż w tym samouczku jest używana jedna rola.

Zrzut ekranu przedstawiający okno Eksploratora rozwiązań z wyróżnionym nowym projektem aplikacja systemu Azure i wyświetloną poniżej opcji nazwa aplikacji i rola procesu roboczego.

Dodawanie internetowego interfejsu API i pakietów OWIN

W menu Narzędzia kliknij pozycję Menedżer pakietów NuGet, a następnie kliknij pozycję Konsola menedżera pakietów.

W oknie Konsola menedżera pakietów wprowadź następujące polecenie:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

Dodawanie punktu końcowego HTTP

W Eksplorator rozwiązań rozwiń projekt AzureApp. Rozwiń węzeł Role, kliknij prawym przyciskiem myszy pozycję WorkerRole1, a następnie wybierz pozycję Właściwości.

Zrzut ekranu przedstawiający menu okna eksploratora rozwiązań z wyróżnionymi krokami wybierania ustawień właściwości roli procesu roboczego.

Kliknij pozycję Punkty końcowe, a następnie kliknij pozycję Dodaj punkt końcowy.

Na liście rozwijanej Protokół wybierz pozycję "http". W obszarze Port publiczny i Port prywatny wpisz wartość 80. Te numery portów mogą być różne. Port publiczny jest używany przez klientów podczas wysyłania żądania do roli.

Zrzut ekranu przedstawiający opcje menu rozwijanego protokołu, które pokazują różne konfiguracje usługi i opcje punktu końcowego.

Konfigurowanie internetowego interfejsu API dla Self-Host

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt WorkerRole1 i wybierz polecenie Dodaj / klasę, aby dodać nową klasę. Nadaj klasie Startupnazwę .

Zrzut ekranu przedstawiający okno Eksploratora rozwiązań z opcjami menu i wyróżnioną ścieżką do dodawania klasy.

Zastąp cały standardowy kod w tym pliku następującym kodem:

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);
        }
    }
}

Dodawanie kontrolera internetowego interfejsu API

Następnie dodaj klasę kontrolera internetowego interfejsu API. Kliknij prawym przyciskiem myszy projekt WorkerRole1 i wybierz polecenie Dodaj / klasę. Nadaj klasie nazwę TestController. Zastąp cały standardowy kod w tym pliku następującym kodem:

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)
            };
        }
    }
}

Dla uproszczenia ten kontroler definiuje tylko dwie metody GET, które zwracają zwykły tekst.

Uruchamianie hosta OWIN

Otwórz plik WorkerRole.cs. Ta klasa definiuje kod uruchamiany po uruchomieniu i zatrzymaniu roli procesu roboczego.

Dodaj następującą instrukcję using:

using Microsoft.Owin.Hosting;

Dodaj składową IDisposable do WorkerRole klasy:

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app = null;

    // ....
}

W metodzie OnStart dodaj następujący kod, aby uruchomić hosta:

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();
}

Metoda WebApp.Start uruchamia hosta OWIN. Nazwa Startup klasy jest parametrem typu dla metody . Zgodnie z konwencją host wywoła metodę Configure tej klasy.

Zastąpij element , OnStop aby usunąć wystąpienie _app :

public override void OnStop()
{
    if (_app != null)
    {
        _app.Dispose();
    }
    base.OnStop();
}

Oto kompletny kod pliku 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();
        }
    }
}

Skompiluj rozwiązanie i naciśnij klawisz F5, aby uruchomić aplikację lokalnie w emulatorze usługi Azure Compute. W zależności od ustawień zapory może być konieczne zezwolenie emulatorowi przez zaporę.

Uwaga

Jeśli wystąpi wyjątek podobny do poniższego, zapoznaj się z tym wpisem w blogu , aby uzyskać obejście problemu. "Nie można załadować pliku lub zestawu "Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" lub jednej z jego zależności. Definicja manifestu zlokalizowanego zestawu jest niezgodna z odwołaniem do zestawu. (Wyjątek od HRESULT: 0x80131040)"

Emulator obliczeniowy przypisuje lokalny adres IP do punktu końcowego. Adres IP można znaleźć, wyświetlając interfejs użytkownika emulatora obliczeń. Kliknij prawym przyciskiem myszy ikonę emulatora w obszarze powiadomień paska zadań, a następnie wybierz pozycję Pokaż interfejs użytkownika emulatora obliczeniowego.

Zrzut ekranu przedstawiający menu i informacje o adresie punktu końcowego punktu końcowego I P w emulatorze obliczeniowym platformy Azure podczas wybierania opcji

Znajdź adres IP w obszarze Wdrożenia usług, wdrożenie [id], Szczegóły usługi. Otwórz przeglądarkę internetową i przejdź do http:// address/test/1, gdzie adres jest adresem IP przypisanym przez emulator obliczeniowy; na przykład http://127.0.0.1:80/test/1. Powinna zostać wyświetlona odpowiedź kontrolera internetowego interfejsu API:

Zrzut ekranu przedstawiający okno przeglądarki z odpowiedzią kontrolera Web A P I po wprowadzeniu adresu I przypisanego przez emulator obliczeniowy.

Wdróż na platformie Azure

W tym kroku musisz mieć konto platformy Azure. Jeśli jeszcze go nie masz, możesz utworzyć bezpłatne konto próbne w ciągu zaledwie kilku minut. Aby uzyskać szczegółowe informacje, zobacz Bezpłatna wersja próbna platformy Microsoft Azure.

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt AzureApp. Kliknij pozycję Opublikuj.

Zrzut ekranu przedstawiający opcje menu okna eksploratora rozwiązań, które wyróżnia kroki do wykonania w celu wdrożenia lub opublikowania projektu.

Jeśli nie zalogowasz się do konta platformy Azure, kliknij pozycję Zaloguj się.

Zrzut ekranu przedstawiający okno dialogowe

Po zalogowaniu wybierz subskrypcję i kliknij przycisk Dalej.

Zrzut ekranu przedstawiający komunikat

Wprowadź nazwę usługi w chmurze i wybierz region. Kliknij pozycję Utwórz.

Zrzut ekranu przedstawiający okno dialogowe

Kliknij przycisk Opublikuj.

Zrzut ekranu przedstawiający okno

Konfigurowanie niestandardowej nazwy domeny dla usługi w chmurze platformy Azure (klasycznej)

Dodatkowe zasoby