Febbraio 2018

Volume 33 Numero 2

Il presente articolo è stato tradotto automaticamente.

Punti dati - Creazione di istanze di Funzioni di Azure in grado di leggere da Cosmos DB quasi senza codice

Da Julie Lerman

Julie LermanNel primo di tali colonne, è mostrato come utilizzare Entity Framework Core 2 (2 Core EF) per archiviare i punteggi di giochi localmente nel dispositivo Windows 10 in cui viene riprodotto il gioco. Nella seconda colonna, questo articolo sia tramite la creazione di una funzione di Azure che accettano i punteggi dei giochi inviati tramite HTTP e archiviarli in un database DB Cosmos. L'obiettivo principale consiste nel modificare il gioco in grado di inviare i relativi punteggi a questa funzione, nonché per recuperare i dati di punteggio da funzioni parallele.

In questa colonna, verrà spiegato come creare le funzioni di Azure che risponderà alle richieste per recuperare due set di dati di punteggio: inizio cinque punteggi per un utente in tutti i dispositivi dell'utente e i punteggi massimi cinque di tutti gli utenti la riproduzione di CookieBinge gioco intorno il World. La volta successiva, nell'ultima colonna della serie, sarà integrare le nuove funzioni di Azure nell'app UWP CookieBinge per consentire agli utenti di condividere e confrontare i punteggi.

La funzione di Azure che è stato creato nell'articolo precedente risponde a una chiamata HTTP e l'utilizzo di integrazioni della funzione, è in grado di eseguire il push dei dati dalla richiesta HTTP in database DB Cosmos senza mai dover scrivere alcun codice di accesso ai dati. Figura 1 viene visualizzato uno dei documenti archiviati nella raccolta Binges del database CookieBinge. I primi sette proprietà sono i dati memorizzati ("connessi" tramite "worthit") e gli altri sono metadati creati dal DB Cosmos quando è stato inserito il record.

Un Record dalla raccolta Binges CookieBinge
Figura 1 Record dalla raccolta Binges CookieBinge

Per le due funzioni, verrà nuovamente sfruttare integrazioni funzione Azure di interagire con lo stesso database DB Cosmos. L'unico codice necessario per l'interazione di database questo tempo sarà alcuni SQL che rappresenta la stringa di query necessario, e si ottiene incorporata le integrazioni, non il codice della funzione. Entrambe le funzioni verranno attivate dalle chiamate HTTP. Il primo verrà richiedere l'ID dell'utente che effettua la richiesta e quindi restituiscono i punteggi massimi cinque l'utente connesso in tutti i dispositivi in cui è riprodotto il gioco. Il secondo non avranno alcun input. restituirà semplicemente i punteggi massimi cinque di tutti i giocatori da tutto il mondo.

Verranno esaminate di compilazione prima di queste funzioni tramite flusso di lavoro del portale Azure, l'aggiunta alle lezioni della colonna precedente. Attraverso il primo di queste funzioni consentono di comprendere come tutte le parti del puzzle adattano tra loro. Verrà quindi illustrato un collegamento al momento per compilare il secondo. Tenere presente che è anche possibile creare funzioni di Azure con gli strumenti di compilazione in Visual Studio 2017, nonché tramite l'interfaccia di funzioni della riga di comando (CLI) con codice di Visual Studio.

Creazione di una funzione per restituire i punteggi migliori di un utente

Verrà ora tornare all'app di CookieBinge funzioni di Azure nel portale di Azure e aggiungere una nuova funzione all'app. Tenere presente che quando si passa il mouse sull'intestazione di gruppo di funzioni con il nome dell'app (funzione), si noterà un in cui è possibile fare clic sul segno più. Quando si esegue l'operazione, verrà chiesto di scegliere un modello per la nuova funzione e, come con la prima funzione che è stata creata, sarà un trigger di c# HTTP. Il nome della nuova funzione GetUserScores, modificare il livello di autorizzazione su anonimo, quindi fare clic su Crea.

Prima di modificare il codice nel file run.csx, verrà creato integrazioni della funzione. Tenere presente che esistono tre tipi di integrazioni:

  • Trigger: Può essere presente solo un singolo trigger e in questo caso, è richiesta HTTP per la funzione.
  • Integrazioni inpue: Possono essere presenti più integrazioni di input e rappresentano altri dati che si desidera rendere disponibili per la funzione.
  • Integrazioni di output: Nell'articolo precedente associata un'integrazione di output al database CookieBinge Cosmos DB, che ha causato i risultati della funzione da archiviare nel database di. Con questa nuova funzione GetUserScores, l'output sarà i risultati della funzione inviati nuovamente al richiedente di una risposta HTTP.

Di collegare l'integrazione di input per recuperare i dati dal database Cosmos DB in cui la funzione StoreScores dall'articolo del mese scorso di essi. Questo input è stata confusi me inizialmente. Presuppone che è necessario scrivere del codice della funzione per connettersi al database ed eseguire query per i punteggi degli utenti. Ma l'integrazione di input è interessante. Posso definirla con SQL rilevanti per una query sul database DB Cosmos e informarlo di utilizzare il valore di ID utente che è stato inviato con la richiesta HTTP. E funzioni di Azure si occupa del resto: connessione al database, l'esecuzione della query e passando a me i risultati della query da utilizzare con il codice della funzione. Sì, molto interessante effettivamente! Facciamolo.

Creazione di un'integrazione Input di lettura dal database Cosmos utilizzando i dati di richiesta HTTP

Per iniziare, fare clic su nuovo Input nel Pannello di integrazioni, quindi nell'elenco dei tipi di input presentate, scegliere DB Cosmos e fare clic sul pulsante Seleziona sotto di essa. Di conseguenza, nel form di input Cosmos DB, i relativi campi popolati con i valori predefiniti. Modificare i valori, come illustrato nella figura 2.

Le impostazioni di integrazione Input Cosmos Azure DB
Figura 2. l'Azure Cosmos DB Input le impostazioni di integrazione

I valori per il nome del Database, nome della raccolta e l'account di Azure Cosmos DB connessione deve corrispondere a quelli utilizzati per la creazione di integrazione di output della funzione StoreScores. In questo caso, ovvero CookieBinge, Binges e datapointscosmosdb_DOCUMENTDB. Il parametro ho denominato "documenti", che verrà utilizzato nel codice della funzione my. ID documento è vuoto. Se si crei una funzione per recuperare un singolo documento Cosmos DB tramite il relativo ID, il risultato sarà un'opzione utile. Ma questa funzione sarà l'esecuzione di query in base a un ID di utente in ingresso.

La Query SQL viene tagliata disattivata nella schermata, in questo modo potete è completamente. Tenere presente che è necessario aggiungerlo come una singola riga, anche se qui ho utilizzato riga restituisce per semplificare la lettura:

SELECT  TOP 5 c.score,c.worthit,c.deviceName,c.dateTime
FROM c
WHERE c.userId={userId}
ORDER by c.score DESC

DB Cosmos Azure presenta una sintassi di query SQL che rende perfettamente versatili da utilizzare.

Si noti il segnaposto per la variabile userID, {userId}. Si utilizzerà questa variabile per associare il trigger e integrazione di input. In primo luogo, è necessario salvare le impostazioni di questo input. Quindi necessario creare un parametro di associazione per associare il trigger per l'input. Questa operazione può essere eseguita in modo che non è immediatamente evidente a me. In realtà, prima di mi impostato correttamente, viene serie visualizzato un errore sul parametro di associazione viene mancante e impiegato da alcuni sforzo combinazione di cosa è dato dal fatto di apprendimento da documenti, i risultati di ricerca Web e alcuni sperimentazione prima è appropriato. Parte del problema è la mancanza di comprensione, anche se una volta individuati la soluzione, le connessioni effettuate senso a me. Probabilmente si noterà la luce più rapidamente perché sto per spoon-feed la soluzione è!

Selezionare il trigger (req) HTTP e specificare un modello di route per il trigger. Il modello deve innanzitutto specificare un nome per la route e quindi specificare l'ID utente variabile di associazione.

La route non deve corrispondere al nome della funzione, ma è probabile che più chiaro in tal caso. È stato denominato miei GetUserScores / {userId}, come illustrato nella figura 3. Non dimenticare di salvare le modifiche.

Le impostazioni di integrazione Trigger HTTP
Figura 3 le impostazioni di integrazione Trigger HTTP

L'integrazione di output può rimanere al relativo valore predefinito, ovvero una risposta HTTP.

A questo punto è necessario restituire il codice di funzione, che è possibile effettuare facendo clic sulla funzione GetUserScores. Verrà visualizzato il codice run.csx, che è ancora nello stato predefinito.

Scrittura del codice di funzione per rispondere alle integrazioni

Si consideri il codice SQL per l'integrazione di input, che consente di recuperare quattro colonne: punteggio, worthit, deviceName e dateTime. È possibile creare una classe in modo che corrisponda a ogni tipo (come nella funzione StoreScores dell'articolo precedente) o indicare solo la funzione che la funzione di input necessario passare un tipo dinamico. Che è quello che il codice utente. Figura 4 Visualizza l'intera funzione nel file run.csx.

Figura 4 il metodo di esecuzione della funzione GetUserScores

using System.Net;
public static HttpResponseMessage Run(string userId,
               HttpRequestMessage req, IEnumerable<dynamic> documents, 
               TraceWriter log)
{
  if (documents != null)
  {
    log.Info($"Document Count: {documents.Count()}");
    return req.CreateResponse(HttpStatusCode.OK,documents);
  }
  else
  {
    return req.CreateResponse(HttpStatusCode.NotFound);
  }
}

Nella sua firma, il metodo Run riconosce che il primo parametro è una stringa denominata userId in arrivo tramite la route specificata nelle impostazioni del trigger. Dopo l'ID utente, i parametri prevedono HttpRequestMessage (req) e quindi l'interfaccia IEnumerable che contiene i documenti. Dietro le quinte, la funzione di richiedere l'ID utente che è stato ricevuto tramite route del trigger e lo passa all'integrazione di input, che consente di eseguire la query (utilizzando l'ID utente) e popolare la variabile di documenti con i risultati della query. Successivamente, la funzione infine chiama la logica di esecuzione del metodo che ho scritto.

Il codice verifica prima che i documenti, infatti, passati al metodo. Un messaggio di output per il log con il numero di tali documenti, quindi passarli semplicemente nella risposta HTTP. Se weren't eseguendo qualsiasi controlli e correttivi integrati, il metodo funzionerà comunque nel formato più semplice:

public static HttpResponseMessage Run(string userId,
              HttpRequestMessage req, IEnumerable<dynamic> documents)
{
  return req.CreateResponse(documents);
}

In altre parole, per l'intera funzione ricevere un ID utente e restituire che cinque punteggi massimi dell'utente dal database accetta solo una singola riga di codice che è non più di "Invia nuovamente i documenti che provengono l'integrazione di input".

Integrazione della funzione Azure hanno effettivamente eseguire tutto il lavoro per l'utente corrente. Sono realmente notevoli.

È possibile testare questa funzione nel portale o in uno strumento come Fiddler o Postman. Eseguire test da un browser non funzionerà con la funzione nello stato corrente perché la funzione restituisce oggetti dinamici e i browser non è possibile inviare l'intestazione Accept necessaria. In alternativa, è possibile definire una classe che corrisponde a risultati della query e utilizzare tale classe anziché un oggetto dinamico. Ma poiché è, la funzione funzionerà correttamente quando questo viene chiamato da Fiddler, Postman o le API, ad esempio quello che si utilizzeranno infine dall'app UWP.

Il collegamento Ottieni URL funzione indica che è possibile chiamare https://cookiebinge.azurewebsites.net/api/GetUserScores/ {userId}. Se la funzione non anonima, quindi è necessario passare alcune credenziali in, ma sono intenzionalmente mantenere semplicemente qui.

Con l'ID utente, 54321, nel segnaposto, l'URL è simile al seguente: https://cookiebinge.azurewebsites.net/api/GetUserScores/54321.

Questo URL restituisce i cinque documenti in formato JSON con lo schema di data shaping dalla query. Uno Ecco dei documenti restituiti nella risposta HTTP, che mostra che quando riprodotto il Xbox, scarfed verso il basso 18 cookie, ma non è stata pertanto lieta su my binge giorno.

{
  "score": 18,
  "worthit": false,
  "deviceName": "XBox",
  "dateTime": "2017-11-05T15:26:00"
}

Un collegamento per la creazione di un'altra funzione Azure completamente integrata

Ora che è necessario imposta la prima funzione, è necessario creare il secondo, che recupererà i punteggi di cinque massimi per tutti i lettori in tutto il mondo. Piuttosto che scorrere tutti i moduli di impostazioni nuovamente, tuttavia, verrà abbiano una scelta rapida. Le impostazioni per tutte le integrazioni di una funzione di Azure vengono archiviate nel file function.json, che è possibile aprire il portale dal riquadro di visualizzazione file. Figura 5 Mostra il function.json per la funzione GetUserScores. La sezione delle associazioni esegue il wrapping di tutte le impostazioni di integrazione.

Figura 5, il File function.json per GetUserScores

{
"bindings": [
  {
    "authLevel": "anonymous",
    "name": "req",
    "type": "httpTrigger",
    "direction": "in",
    "route": "GetUserScores/{userId}"
  },
  {
    "name": "$return",
    "type": "http",
    "direction": "out"
  },
  {
    "type": "documentDB",
    "name": "documents",
    "databaseName": "CookieBinge",
    "collectionName": "Binges",
    "sqlQuery": "SELECT  TOP {top} c.score,c.worthit,c.deviceName,
      c.dateTime FROM c WHERE c.userId={userId} ORDER by c.score DESC",
    "connection": "datapointscosmosdb_DOCUMENTDB",
    "direction": "in"
  }
],
"disabled": false
}

Il primo binding è httpTrigger, indicato nella proprietà di tipo. Si noti che tutto il resto delle relative impostazioni sono descritti da altre proprietà di authLevel, nome, direzione e la route. Successivamente è possibile visualizzare associazione di output http e, infine, l'associazione con tutte le impostazioni di input specificato nel modulo.

Dopo avere creato una migliore comprensione di tutte le parti del puzzle della funzione, non è effettivamente necessario passare attraverso il form, se non si desidera. È possibile creare direttamente il file function.json e che è quello che farò sarà per la seconda funzione. È comunque necessario per aggiungere la nuova funzione per l'app di funzione, così non che, utilizzando un modello HttpTrigger c# e chiamarlo GetGlobalScores.

Ma questa volta, anziché dover passare alla sezione integrazione, aprire il file function.json nel riquadro Visualizzazione file e sostituirlo con il codice in figura 6. Si noti che il valore di query SQL è stato eseguito il wrapping qui nell'elenco, ma questa stringa deve essere su una riga.

Figura 6 il File function.json per GetGlobalScores

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "documents",
      "databaseName": "CookieBinge",
      "collectionName": "Binges",
      "connection": "datapointscosmosdb_DOCUMENTDB",
      "direction": "in",
      "sqlQuery": "SELECT  TOP 5 c.userName, c.score,c.worthit,c.deviceName,
        c.dateTime FROM c ORDER by c.score DESC"
    }
  ],
  "disabled": false
}

Poiché questa richiesta non è necessario passare un id, non vi è alcuna route sull'associazione httpTrigger come con la prima funzione. L'associazione di output è lo stesso come in precedenza. L'unica differenza con l'associazione di input è una query diversa non filtra un ID utente.

Comprendere e applicare i binding nel relativo formato non elaborato può certamente di risparmiare molto tempo. Richiede il percorso esplicito di utilizzare i formati per le impostazioni di input è stato utile, tuttavia, come che ha contribuito a me comprendere le impostazioni come si inizia ad su di essi. Infatti, viene visualizzato come la configurazione viene archiviata, è molto bene preparata compilare le funzioni di Azure in Visual Studio o codice di Visual Studio, piuttosto che nel portale.

Ora per il codice della funzione, che è quasi identico al codice per la prima funzione, ad eccezione del fatto che non sono nell'associazione di ID utente come primo parametro. Di seguito è riportata la firma del metodo Run modificata:

public static HttpResponseMessage Run(
              HttpRequestMessage req, IEnumerable<dynamic> documents, TraceWriter log)

Modificato manualmente alcuni dei dati di test nella raccolta Cosmos DB Binges per assicurarsi che si sono un numero di valori di ID utente diverso prima di eseguire la nuova funzione GetGlobalUserScores per convalidare che tutto è stato funziona correttamente.

Collegamento App UWP con le funzioni di Azure

Con le tre funzioni di Azure e il database di documenti DB Cosmos per archiviare e recuperare i punteggi di utente in corso, la parte finale di questa serie verrà restituito all'app UWP per integrare le funzioni. Tenere presente che l'app UWP attualmente Usa Entity Framework Core 2 per archiviare i punteggi di utente in locale in qualsiasi dispositivo Windows 10 in cui viene riprodotto il gioco. Nell'iterazione successiva, oltre all'archiviazione locale, verranno inviati alla funzione Azure StoreScores punteggi di un utente (con le autorizzazioni) per l'archiviazione nel cloud. E gli utenti saranno in grado di recuperare un elenco dei propri punteggi massimi per tutti i dispositivi in cui è stato riprodotto, nonché per visualizzare i punteggi massimi di tutti i lettori in tutto il mondo. L'app verrà chiamare le funzioni create qui per segnalare che i dati all'utente.

Si noti che sarà probabilmente arrestato personale demo funzioni negli URL di cui è descritto in precedenza in questo articolo. Sono ospitati nel mio account di sottoscrizione di Visual Studio, che è a scopo di test e ha un limite di spesa.


Julie Lermanè un direttore regionale Microsoft, Microsoft MVP, istruttore team software e consulente vive massimi di Vermont. È possibile trovare la presentazione di accesso ai dati e altri argomenti in gruppi di utenti e conferenze tutto il mondo. Un blog all'utente e la indirizzo thedatafarm.com ed è l'autore di "Programmazione di Entity Framework", nonché un Code First e un'edizione DbContext, tutto da o ' Reilly Media. Seguire proprio su Twitter: @julielerman e vedere proprio corsi Pluralsight PS/juliel.me-video.

Grazie per il seguente esperto tecnico di Microsoft per la revisione dell'articolo: Jeff Hollan
Jeff Hollan è Senior Program Manager per le funzioni di Microsoft Azure.  Egli è unito a Microsoft un po' più di 4 anni fa e ha impiegato ora back-end gestione IT sistemi e integrazioni e aiutare a gestire altri prodotti in Azure, incluse le app di logica. Jeff è faceva riferimento tecnico di tutte le operazioni, è noto per le presentazioni conferenze tutto il mondo. È possibile seguire Jeff su Twitter @jeffhollan


Viene illustrato in questo articolo nel forum di MSDN Magazine