Compilare un front-end di servizio Web per l'applicazione tramite ASP.NET CoreBuild a web service front end for your application using ASP.NET Core

Per impostazione predefinita, i servizi di Azure Service Fabric non forniscono un'interfaccia pubblica per il Web.By default, Azure Service Fabric services do not provide a public interface to the web. Per esporre la funzionalità dell'applicazione ai client HTTP è necessario creare un progetto Web da usare come punto di ingresso per comunicare con i singoli servizi.To expose your application's functionality to HTTP clients, you have to create a web project to act as an entry point and then communicate from there to your individual services.

Questa esercitazione è la prosecuzione dell'esercitazione Creare la prima applicazione in Visual studio. Verrà aggiunto un servizio Web ASP.NET Core per il servizio dei contatori con stato.In this tutorial, we pick up where we left off in the Creating your first application in Visual Studio tutorial and add an ASP.NET Core web service in front of the stateful counter service. Se non è già stato fatto, è necessario tornare indietro ed eseguire prima quella esercitazione.If you have not already done so, you should go back and step through that tutorial first.

Configurare l'ambiente per ASP.NET CoreSet up your environment for ASP.NET Core

Per completare questa esercitazione è necessario Visual Studio 2017.You need Visual Studio 2017 to follow along with this tutorial. Qualsiasi edizione è adeguata.Any edition will do.

Per sviluppare applicazioni Service Fabric ASP.NET Core è necessario avere installato i carichi di lavoro seguenti:To develop ASP.NET Core Service Fabric applications, you should have the following workloads installed:

  • Sviluppo di Azure (in Web e cloud)Azure development (under Web & Cloud)
  • Sviluppo ASP.NET e Web (in Web e cloud)ASP.NET and web development (under Web & Cloud)
  • Sviluppo multipiattaforma .NET Core (in Altri set di strumenti).NET Core cross-platform development (under Other Toolsets)

Nota

Gli strumenti .NET Core per Visual Studio 2015 non vengono più aggiornati. Se si usa Visual Studio 2015 è necessario avere installato .NET Core VS 2015 Tooling Preview 2.The .NET Core tools for Visual Studio 2015 are no longer being updated, however if you are still using Visual Studio 2015, you need to have .NET Core VS 2015 Tooling Preview 2 installed.

Aggiungere un servizio ASP.NET Core all'applicazioneAdd an ASP.NET Core service to your application

ASP.NET Core è un framework di sviluppo Web multipiattaforma leggero, che consente di creare un'interfaccia utente Web e API Web moderne.ASP.NET Core is a lightweight, cross-platform web development framework that you can use to create modern web UI and web APIs.

Ora verrà aggiunto un progetto API Web ASP.NET all'applicazione esistente.Let's add an ASP.NET Web API project to our existing application.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse su Servizi nel progetto dell'applicazione e scegliere Aggiungi > Nuovo servizio Service Fabric.In Solution Explorer, right-click Services within the application project and choose Add > New Service Fabric Service.

    Aggiunta di un nuovo servizio a un'applicazione esistente

  2. Nella pagina Crea servizio scegliere ASP.NET Core e assegnare un nome.On the Create a Service page, choose ASP.NET Core and give it a name.

    Scelta di un servizio Web ASP.NET nella finestra di dialogo del nuovo servizio

  3. Nella pagina successiva è disponibile un set di modelli di progetto ASP.NET Core.The next page provides a set of ASP.NET Core project templates. Si tratta degli stessi modelli che verrebbero visualizzati se si creasse un progetto ASP.NET Core all'esterno di un'applicazione di Service Fabric, con una piccola quantità di codice aggiuntivo per registrare il servizio con il runtime di Service Fabric.Note that these are the same choices that you would see if you created an ASP.NET Core project outside of a Service Fabric application, with a small amount of additional code to register the service with the Service Fabric runtime. Per questa esercitazione si sceglierà API Web,For this tutorial, choose Web API. ma è possibile applicare gli stessi concetti anche alla compilazione di un'applicazione Web completa.However, you can apply the same concepts to building a full web application.

    Scelta di un tipo di progetto ASP.NET

    Dopo la creazione del progetto API Web l'applicazione includerà due servizi.Once your Web API project is created, you should have two services in your application. Man mano che si compila l'applicazione, si aggiungeranno altri servizi seguendo esattamente la stessa proceduraAs you continue to build your application, you can add more services in exactly the same way. e, per ogni servizio, sarà possibile eseguire in modo indipendente il controllo della versione e l'aggiornamento.Each can be independently versioned and upgraded.

Eseguire l'applicazioneRun the application

Per avere un'idea di quanto è stato fatto, verrà ora distribuita la nuova applicazione ed esaminato il comportamento predefinito del modello API Web ASP.NET Core.To get a sense of what we've done, let's deploy the new application and take a look at the default behavior that the ASP.NET Core Web API template provides.

  1. Premere F5 in Visual Studio per eseguire il debug dell'app.Press F5 in Visual Studio to debug the app.
  2. Al termine della distribuzione Visual Studio avvia un browser nella radice del servizio API Web ASP.NET.When deployment is complete, Visual Studio launches a browser to the root of the ASP.NET Web API service. Il modello API Web ASP.NET Core non prevede un comportamento predefinito per la radice, quindi nel browser viene visualizzato un errore 404.The ASP.NET Core Web API template doesn't provide default behavior for the root, so you should see a 404 error in the browser.
  3. Aggiungere /api/values al percorso nel browser.Add /api/values to the location in the browser. Questa operazione chiama il metodo Get su ValuesController nel modello API WebThis invokes the Get method on the ValuesController in the Web API template. e restituisce la risposta predefinita trasmessa dal modello, una matrice JSON contenente due stringhe:It returns the default response that is provided by the template--a JSON array that contains two strings:

    Valori predefiniti restituiti dal modello API Web ASP.NET Core

    Al termine dell'esercitazione questa pagina visualizza il valore del contatore più recente del servizio con stato anziché le stringhe predefinite.By the end of the tutorial, this page will show the most recent counter value from our stateful service instead of the default strings.

Connettere i serviziConnect the services

L'infrastruttura di servizi offre la massima flessibilità nella comunicazione con Reliable Services.Service Fabric provides complete flexibility in how you communicate with reliable services. In una singola applicazione possono coesistere servizi accessibili tramite TCP, altri tramite un'API REST HTTP e altri ancora tramite Web Socket.Within a single application, you might have services that are accessible via TCP, other services that are accessible via an HTTP REST API, and still other services that are accessible via web sockets. Per informazioni sulle opzioni disponibili e sui compromessi necessari, vedere Comunicazione con i servizi.For background on the options available and the tradeoffs involved, see Communicating with services. In questa esercitazione si usa il servizio remoto di Service Fabric disponibile nel SDK.In this tutorial, we use Service Fabric Service Remoting, provided in the SDK.

Nell'approccio con servizio remoto, basato sulle chiamate Remote Procedure Call o RPC, viene definita un'interfaccia da usare come contratto pubblico per il servizioIn the Service Remoting approach (modeled on remote procedure calls or RPCs), you define an interface to act as the public contract for the service. e quindi si usa tale interfaccia per generare una classe proxy per l'interazione con il servizio.Then, you use that interface to generate a proxy class for interacting with the service.

Creare l'interfaccia di comunicazione remotaCreate the remoting interface

Per iniziare si crea l'interfaccia da usare come contratto tra il servizio con stato e gli altri servizi, in questo caso il progetto Web ASP.NET Core.Let's start by creating the interface to act as the contract between the stateful service and other services, in this case the ASP.NET Core web project. Questa interfaccia deve essere condivisa da tutti i servizi che la usano per le chiamate RPC, pertanto va creata in un progetto Libreria di classi specifico.This interface must be shared by all services that use it to make RPC calls, so we'll create it in its own Class Library project.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere Aggiungere > Nuovo progetto.In Solution Explorer, right-click your solution and choose Add > New Project.

  2. Scegliere la voce Visual C# nel riquadro di spostamento sinistro e quindi selezionare il modello Libreria di classi.Choose the Visual C# entry in the left navigation pane and then select the Class Library template. Verificare che la versione di .NET Framework sia impostata su 4.5.2.Ensure that the .NET Framework version is set to 4.5.2.

    Creazione di un progetto interfaccia per il servizio con stato

  3. Installare il pacchetto NuGet Microsoft.ServiceFabric.Services.Remoting.Install the Microsoft.ServiceFabric.Services.Remoting NuGet package. Cercare Microsoft.ServiceFabric.Services.Remoting in Gestione pacchetti NuGet e installarlo per tutti i progetti della soluzione che usano il servizio remoto, tra cui:Search for Microsoft.ServiceFabric.Services.Remoting in the NuGet package manager and install it for all projects in the solution that use Service Remoting, including:

    • Il progetto Libreria di classi che contiene l'interfaccia del servizioThe Class Library project that contains the service interface
    • Il progetto di servizio con statoThe Stateful Service project
    • Il progetto di servizio Web ASP.NET CoreThe ASP.NET Core web service project

      Aggiunta del pacchetto NuGet dei servizi

  4. Nella libreria di classi creare un'interfaccia con un solo metodo, GetCountAsync, ed estendere l'interfaccia da Microsoft.ServiceFabric.Services.Remoting.IService.In the class library, create an interface with a single method, GetCountAsync, and extend the interface from Microsoft.ServiceFabric.Services.Remoting.IService. L'interfaccia di comunicazione remota deve derivare da questa interfaccia, per indicare che si tratta di un'interfaccia di comunicazione remota del servizio.The remoting interface must derive from this interface to indicate that it is a Service Remoting interface.

    using Microsoft.ServiceFabric.Services.Remoting;
    using System.Threading.Tasks;
    
    ...
    
    namespace MyStatefulService.Interface
    {
        public interface ICounter: IService
        {
            Task<long> GetCountAsync();
        }
    }
    

Implementare l'interfaccia nel servizio con statoImplement the interface in your stateful service

Dopo aver definito l'interfaccia, è ora necessario implementarla nel servizio con stato.Now that we have defined the interface, we need to implement it in the stateful service.

  1. Nel servizio con stato aggiungere un riferimento al progetto della libreria di classi contenente l'interfaccia.In your stateful service, add a reference to the class library project that contains the interface.

    Aggiunta di un riferimento al progetto libreria di classi nel servizio con stato

  2. Trovare la classe che eredita da StatefulService, ad esempio MyStatefulService, ed estenderla per implementare l'interfaccia ICounter.Locate the class that inherits from StatefulService, such as MyStatefulService, and extend it to implement the ICounter interface.

    using MyStatefulService.Interface;
    
    ...
    
    public class MyStatefulService : StatefulService, ICounter
    {        
         ...
    }
    
  3. Implementare ora il singolo metodo definito nell'interfaccia ICounter: GetCountAsync.Now implement the single method that is defined in the ICounter interface, GetCountAsync.

    public async Task<long> GetCountAsync()
    {
        var myDictionary = 
            await this.StateManager.GetOrAddAsync<IReliableDictionary<string, long>>("myDictionary");
    
        using (var tx = this.StateManager.CreateTransaction())
        {          
            var result = await myDictionary.TryGetValueAsync(tx, "Counter");
            return result.HasValue ? result.Value : 0;
        }
    }
    

Esporre il servizio con stato usando un listener di comunicazione remotaExpose the stateful service using a service remoting listener

Con l'interfaccia ICounter implementata, il passaggio finale è l'apertura del canale di comunicazione remota del servizio.With the ICounter interface implemented, the final step is to open the Service Remoting communication channel. Per i servizi con stato, Service Fabric offre un metodo sostituibile denominato CreateServiceReplicaListeners,For stateful services, Service Fabric provides an overridable method called CreateServiceReplicaListeners. in cui è possibile specificare uno o più listener di comunicazione in base al tipo di comunicazione che si vuole abilitare per il servizio.With this method, you can specify one or more communication listeners, based on the type of communication that you want to enable for your service.

Nota

Il metodo equivalente per aprire un canale di comunicazione con i servizi senza stato è denominato CreateServiceInstanceListeners.The equivalent method for opening a communication channel to stateless services is called CreateServiceInstanceListeners.

In questo caso si sostituisce il metodo CreateServiceReplicaListeners esistente e si specifica un'istanza dell'oggetto ServiceRemotingListener, che crea un endpoint RPC chiamabile dai client tramite ServiceProxy.In this case, we replace the existing CreateServiceReplicaListeners method and provide an instance of ServiceRemotingListener, which creates an RPC endpoint that is callable from clients through ServiceProxy.

Il metodo di estensione CreateServiceRemotingListener sull'interfaccia IService consente di creare facilmente un ServiceRemotingListener con tutte le impostazioni predefinite.The CreateServiceRemotingListener extension method on the IService interface allows you to easily create a ServiceRemotingListener with all default settings. Per usare questo metodo di estensione verificare che sia stato importato lo spazio dei nomi Microsoft.ServiceFabric.Services.Remoting.Runtime.To use this extension method, ensure you have the Microsoft.ServiceFabric.Services.Remoting.Runtime namespace imported.

using Microsoft.ServiceFabric.Services.Remoting.Runtime;

...

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new List<ServiceReplicaListener>()
    {
        new ServiceReplicaListener(
            (context) =>
                this.CreateServiceRemotingListener(context))
    };
}

Usare la classe ServiceProxy per interagire con il servizioUse the ServiceProxy class to interact with the service

Il servizio con stato è ora pronto per ricevere traffico da altri servizi tramite RPC.Our stateful service is now ready to receive traffic from other services over RPC. e quindi non resta che aggiungere il codice per comunicare con esso dal servizio Web ASP.NET.So all that remains is adding the code to communicate with it from the ASP.NET web service.

  1. Nel progetto ASP.NET aggiungere un riferimento alla libreria di classi contenente l'interfaccia ICounter .In your ASP.NET project, add a reference to the class library that contains the ICounter interface.

  2. In precedenza è stato aggiunto al progetto ASP.NET il pacchetto NuGet Microsoft.ServiceFabric.Services.Remoting.Earlier you added the Microsoft.ServiceFabric.Services.Remoting NuGet package to the ASP.NET project. Questo pacchetto offre la classe ServiceProxy che consente di eseguire chiamate RPC al servizio con stato.This package provides the ServiceProxy class which you use to make RPC calls to the stateful service. Verificare che questo pacchetto NuGet sia installato nel progetto di servizio Web ASP.NET Core.Ensure this NuGet package is installed in the ASP.NET Core web service project.

  3. Nella cartella Controller aprire la classe ValuesController.In the Controllers folder, open the ValuesController class. Si noti che il metodo Get restituisce attualmente solo una matrice di stringhe hardcoded con "value1" e "value2", che corrisponde a quanto visto in precedenza nel browser.Note that the Get method currently just returns a hard-coded string array of "value1" and "value2"--which matches what we saw earlier in the browser. Sostituire l'implementazione con il codice seguente:Replace this implementation with the following code:

    using MyStatefulService.Interface;
    using Microsoft.ServiceFabric.Services.Client;
    using Microsoft.ServiceFabric.Services.Remoting.Client;
    
    ...
    
    [HttpGet]
    public async Task<IEnumerable<string>> Get()
    {
        ICounter counter =
            ServiceProxy.Create<ICounter>(new Uri("fabric:/MyApplication/MyStatefulService"), new ServicePartitionKey(0));
    
        long count = await counter.GetCountAsync();
    
        return new string[] { count.ToString() };
    }
    

    La prima riga del codice è quella più importante.The first line of code is the key one. Per creare il proxy ICounter per il servizio con stato, è necessario fornire due informazioni: un ID partizione e il nome del servizio.To create the ICounter proxy to the stateful service, you need to provide two pieces of information: a partition ID and the name of the service.

    Il partizionamento consente di ridimensionare i servizi con stato suddividendone lo stato in diversi bucket in base a una chiave definita, ad esempio l'ID cliente o il CAP.You can use partitioning to scale stateful services by breaking up their state into different buckets, based on a key that you define, such as a customer ID or postal code. In questa semplice applicazione la chiave non è importante, perché il servizio con stato ha una sola partizioneIn our trivial application, the stateful service only has one partition, so the key doesn't matter. e qualsiasi chiave specificata restituirà la stessa partizione.Any key that you provide will lead to the same partition. Per altre informazioni sul partizionamento dei servizi, vedere Partizionare Reliable Services di Service Fabric.To learn more about partitioning services, see How to partition Service Fabric Reliable Services.

    Il nome del servizio è un URI in formato fabric:/<nome_applicazione>/<nome_servizio>.The service name is a URI of the form fabric:/<application_name>/<service_name>.

    Con queste due informazioni, Service Fabric può identificare in modo univoco il computer a cui inviare le richieste.With these two pieces of information, Service Fabric can uniquely identify the machine that requests should be sent to. La classe ServiceProxy gestirà facilmente anche i casi in cui il computer che ospita la partizione del servizio con stato presenta un errore e un altro computer deve essere alzato di livello per sostituirlo.The ServiceProxy class also seamlessly handles the case where the machine that hosts the stateful service partition fails and another machine must be promoted to take its place. Questa astrazione semplifica notevolmente la scrittura di codice client per gestire gli altri servizi.This abstraction makes writing the client code to deal with other services significantly simpler.

    Una volta che il proxy è disponibile, è sufficiente richiamare il metodo GetCountAsync e restituirne il risultato.Once we have the proxy, we simply invoke the GetCountAsync method and return its result.

  4. Premere di nuovo F5 per eseguire l'applicazione modificata.Press F5 again to run the modified application. Come in precedenza, Visual Studio avvia automaticamente il browser nella radice del progetto Web.As before, Visual Studio automatically launches the browser to the root of the web project. Aggiungere il percorso "api/values" per visualizzare il valore del contatore attualmente restituito.Add the "api/values" path, and you should see the current counter value returned.

    Valore del contatore con stato visualizzato nel browser

    Aggiornare regolarmente il browser per visualizzare l'aggiornamento del valore del contatore.Refresh the browser periodically to see the counter value update.

Connessione a un servizio Reliable ActorConnecting to a Reliable Actor service

Questa esercitazione ha illustrato la procedura per aggiungere un front-end Web in grado di comunicare con un servizio con stato.This tutorial focused on adding a web front end that communicated with a stateful service. Per comunicare con gli attori è possibile seguire un modello molto simile.However, you can follow a very similar model to talk to actors. Quando si crea un progetto Reliable Actor, Visual Studio genera automaticamente un progetto interfaccia.When you create a Reliable Actor project, Visual Studio automatically generates an interface project for you. È possibile usare tale interfaccia per generare un proxy attore nel progetto Web per comunicare con l'attore.You can use that interface to generate an actor proxy in the web project to communicate with the actor. Poiché il canale di comunicazione viene fornito automaticamente,The communication channel is provided automatically. non è necessario eseguire operazioni, ad esempio stabilire un oggetto ServiceRemotingListener, come per il servizio con stato.So you do not need to do anything that is equivalent to establishing a ServiceRemotingListener like you did for the stateful service in this tutorial.

Funzionamento dei servizi Web in un cluster localeHow web services work on your local cluster

In generale è possibile distribuire esattamente la stessa applicazione Service Fabric anche in un cluster con più computer distribuito nel cluster locale con la certezza che funzionerà come previsto,In general, you can deploy exactly the same Service Fabric application to a multi-machine cluster that you deployed on your local cluster and be highly confident that it works as you expect. perché il cluster locale è semplicemente una configurazione a cinque nodi compressa in un solo computer.This is because your local cluster is simply a five-node configuration that is collapsed to a single machine.

Quando si tratta di servizi Web, tuttavia, c'è una sola possibilità.When it comes to web services, however, there is one key nuance. Quando il cluster si trova dietro un servizio di bilanciamento del carico, come in Azure, è necessario assicurarsi che i servizi Web vengano distribuiti in ogni computer, perché il servizio di bilanciamento del carico si limita a eseguire il round robin del traffico tra i computer.When your cluster sits behind a load balancer, as it does in Azure, you must ensure that your web services are deployed on every machine since the load balancer simply round-robins traffic across the machines. A tale scopo, è possibile impostare InstanceCount per il servizio sul valore speciale "-1".You can do this by setting the InstanceCount for the service to the special value of "-1".

Quando invece si esegue il servizio Web in locale, è necessario assicurarsi che solo un'istanza del servizio sia in esecuzione.By contrast, when you run a web service locally, you need to ensure that only one instance of the service is running. In caso contrario si verificano conflitti tra più processi in ascolto sullo stesso percorso e sulla stessa porta.Otherwise, you run into conflicts from multiple processes that are listening on the same path and port. Per le distribuzioni locali, quindi, è opportuno impostare il numero delle istanze del servizio Web su 1.As a result, the web service instance count should be set to "1" for local deployments.

Per informazioni su come configurare valori diversi a seconda dell'ambiente, vedere Gestione dei parametri dell'applicazione per più ambienti.To learn how to configure different values for different environment, see Managing application parameters for multiple environments.

Passaggi successiviNext steps

Dopo l'impostazione del front-end Web per l'applicazione con ASP.NET Core, vedere altre informazioni su ASP.NET Core in Reliable Services di Service Fabric per un esame dettagliato dell'interazione tra ASP.NET Core e Service Fabric.Now that you have a web front end set up for your application with ASP.NET Core, learn more about ASP.NET Core in Service Fabric Reliable Services for an in-depth understanding of how ASP.NET Core works with Service Fabric.

Altre informazioni sulla comunicazione tra servizi in generale sono disponibili per completare il quadro del funzionamento della comunicazione tra servizi in Service Fabric.Next, learn more about communicating with services in general to get a complete picture of how service communication works in Service Fabric.

Dopo avere acquisito una buona comprensione del funzionamento della comunicazione tra servizi, creare un cluster in Azure e distribuire la propria applicazione nel cloud.Once you have a good understanding of how service communication works, create a cluster in Azure and deploy your application to the cloud.