2017-08-21 3 views
2

J'écris une fonction Azure Azure en F # et je voudrais lier un paramètre de type DocumentClient pour avoir plus de contrôle sur les requêtes qui sont effectuées dans Cosmos DB. Voilà ce que j'ai jusqu'à présent:Liaison DocumentClient dans le paramètre de la fonction Azure

Function.fs

namespace Functions 

open System 
open System.Net 
open System.Net.Http 
open Newtonsoft.Json 
open Microsoft.Azure.Documents 
open Microsoft.Azure.Documents.Client 
open Microsoft.Azure.WebJobs 
open Microsoft.Azure.WebJobs.Host 
open Microsoft.Azure.WebJobs.Extensions 
open Microsoft.Azure.WebJobs.Extensions.DocumentDB 

module Function = 
    let Run(req: HttpRequestMessage, [<DocumentDB>] client: DocumentClient, log: TraceWriter) = 
    log.Info(sprintf "F# HTTP trigger function processed a request.") 
    req.CreateResponse(HttpStatusCode.OK) 

function.json

{ 
    "disabled": false, 
    "scriptFile": "..\\..\\..\\build\\Debug\\Functions\\Functions.dll", 
    "entryPoint": "Functions.Function.Run", 
    "bindings": [ 
    { 
     "direction": "in", 
     "type": "httpTrigger", 
     "authLevel": "anonymous", 
     "name": "req", 
     "methods": [ "get" ], 
     "route": "users" 
    }, 
    { 
     "direction": "in", 
     "type": "documentDB", 
     "name": "client", 
     "connection": "COSMOSDB_CONNECTION_STRING" 
    }, 
    { 
     "direction": "out", 
     "type": "http", 
     "name": "res" 
    } 
    ] 
} 

host.json

{ 
    "frameworks": { 
    "net46":{ 
     "dependencies": { 
     "Dynamitey": "1.0.2", 
     "FSharp.Interop.Dynamic": "3.0.0", 
     "Microsoft.Azure.DocumentDB": "1.17.0", 
     "Microsoft.Azure.WebJobs.Extensions.DocumentDB": "1.0.0" 
     } 
    } 
    } 
} 

local.settings.json

{ 
    "IsEncrypted": false, 
    "Values": { 
    "AzureWebJobsDashboard": "", 
    "AzureWebJobsStorage": "UseDevelopmentStorage=true", 
    "COSMOSDB_CONNECTION_STRING": "AccountEndpoint=https://localhost:8081;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" 
    } 
} 

Je lance la fonction localement en utilisant le stockage de développement et l'émulateur DB Cosmos. J'ai essayé de traduire en F # ce qu'il est décrit here pour C#. Et c'est aussi à peu près la même chose que ce qui est mentionné here. Mais je reçois seulement l'erreur Microsoft.Azure.WebJobs.Extensions.DocumentDB: 'Id' is required when binding to a DocumentClient property.

Répondre

5

Il existe une solution de contournement mentionnée dans this issue on Github. Il est fixé dans le tooling et sera disponible avec la prochaine version

solution copié à partir de GitHub

J'ai trouvé la question et a déposé https://github.com/Azure/azure-functions-cli/issues/206. La solution de contournement la plus simple jusqu'à ce que nous ayons une mise à jour:

Passez à C:\Users\{user}\appdata\local\Azure.Functions.Cli\1.0.0.

Ouvrir func.exe.config dans le bloc-notes.

Trouvez ceci:

<dependentAssembly> 
    <assemblyIdentity name="Microsoft.Azure.Documents.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-1.11.0.0" newVersion="1.11.0.0" /> 
</dependentAssembly> 

Dans les deux endroits, avec 1.13.0.01.11.0.0 remplacer si vous vous retrouvez avec:

<dependentAssembly> 
    <assemblyIdentity name="Microsoft.Azure.Documents.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-1.13.0.0" newVersion="1.13.0.0" /> 
    </dependentAssembly> 

Enregistrer et essayez de nouveau.

+0

Oui, cela fonctionne.Merci! J'avais installé Microsoft.Azure.DocumentDB v.1.17 ainsi j'ai dû rétrograder à v.1.13. –

+0

Merci pour la solution de contournement, il suffit de frapper ce problème! –

+0

Hm. Je me demande ce que nous sommes supposés faire si nous obtenons cette erreur de w/dans l'IDE des fonctions sur le portail ... – bc3tech