2017-09-01 1 views
0

Je rencontre un problème avec une liaison de sortie Azure Service Bus que je ne suis pas sûr de savoir comment procéder. Je n'ai pas eu de chance de trouver une question similaire, alors je m'excuse si c'est un doublon. J'essaie d'utiliser le processus de développement VS 2017 local, donc les liaisons function.json doivent être générées automatiquement. La signature de la fonction est la suivante:Erreur avec la liaison de sortie du bus de service Azure Function

[FunctionName("RequestNewPaladinInvitation")] 
    public static HttpResponseMessage Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req, 
    [ServiceBus("thequeue")] ICollector<Invitation> invitationOutputQueue, 
    TraceWriter log) 
    { 
    //Do some stuff and write to the queue 
    invitationOutputQueue.Add(invite); 
    } 

Je reçois l'erreur suivante lors de l'exécution locale de la fonction.

Microsoft.Azure.WebJobs.Host: Erreur méthode d'indexation 'RequestNewPaladinInvitation.Run. Microsoft.Azure.WebJobs.Host: Impossible de lier le paramètre 'invitationOutputQueue' à ICollector`1. Assurez-vous que le paramètre Type est pris en charge par la liaison. Si vous êtes en utilisant des extensions de liaison (par exemple ServiceBus, Timers, etc.) assurez-vous que vous avez appelé la méthode d'enregistrement de vos extensions dans votre code de démarrage (par exemple, config.UseServiceBus(), config.UseTimers (), etc.). [01/09/2017 17:42:49] Erreur méthode d'indexation 'RequestNewPaladinInvitation.Run'

Les deux mon host.json et local.settings.json sont définis comme suit:

{ 
    "IsEncrypted": false, 
    "Values": { 
     "AzureWebJobsStorage": "<MyStorageAccountInfo>", 
     "AzureWebJobsDashboard": "<MyDashboardInfo>", 
     "AzureWebJobsServiceBus": "<MyServiceBusConnectionString>" 
    } 
} 

J'étais sous l'impression que la définition de la valeur AzureWebJobsServiceBus ferait que ServiceBusAccount par défaut pour toutes les liaisons ServiceBus à travers l'application de fonction.

J'ai également essayé explicitement de pointer la liaison ServiceBus à la chaîne de connexion pour le compte avec l'attribut alternatif suivant [ServiceBus("createpaladininvitation",Connection = "ServiceBus")]. Ma compréhension de la convention est que la partie AzureWebJobs ne doit pas être incluse. Juste au cas où j'ai mal compris, j'ai aussi essayé [ServiceBus("createpaladininvitation",Connection = "AzureWebJobsServiceBus")]. J'ai même essayé de décorer la méthode et le paramètre avec l'attribut suivant, [ServiceBusAccount("ServiceBus")]. J'ai également essayé les mêmes variations qu'avec le paramètre Connection pour l'attribut ServiceBus.

Dans tous les cas, j'obtiens la même sortie de function.json, qui ne montre aucune liaison générée pour la liaison de sortie ServiceBus.

Voici le function.json:

{ 
    "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0", 
    "configurationSource": "attributes", 
    "bindings": [ 
    { 
     "type": "httpTrigger", 
     "methods": [ 
     "post" 
     ], 
     "authLevel": "anonymous", 
     "name": "req" 
    } 
    ], 
    "disabled": false, 
    "scriptFile": "..\\bin\\AzureFunctionsPoc.dll", 
    "entryPoint": "AzureFunctionsPoc.RequestNewPaladinInvitation.Run" 
} 

On dirait que je manque quelque chose évidente.

[Mise à jour]

Comme je l'ai essayé de continuer à comprendre ce qui se passe, j'ai couru la fonction localement et modifié le fichier function.json généré et ajouté la liaison que je pense aurait dû être généré. Le résultat result.json manuellement modifié est:

{ 
    "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.0.0", 
    "configurationSource": "attributes", 
    "bindings": [ 
    { 
     "type": "httpTrigger", 
     "methods": [ 
     "post" 
     ], 
     "authLevel": "anonymous", 
     "name": "req" 
    }, 
    { 
     "type": "serviceBus", 
     "name": "invitationOutputQueue", 
     "queueName": "createpaladininvitation", 
     "connection": "ServiceBus", 
     "direction": "out" 
    } 
    ], 
    "disabled": false, 
    "scriptFile": "..\\bin\\AzureFunctionsPoc.dll", 
    "entryPoint": "AzureFunctionsPoc.RequestNewPaladinInvitation.Run" 
} 

Avec ces modifications, la méthode fonctionne exactement comme prévu. Cela ressemble encore plus à un problème de syntaxe ou de convention qui me manque, ou à un bug d'outillage.

+0

semble similaire à [cette question] (https://stackoverflow.com/questions/45986719/using-azure-functions-in-vs2017-cannot-bind-to-servicebus-queue-as-an-output) – Mikhail

+0

@Mikhail - J'ai jeté un coup d'œil à la question à laquelle vous étiez lié. Cela a semblé similaire. À la différence de cette question, cependant, dans mon cas, changer le type de déclencheur n'a pas semblé faire n'importe quelle différence. Merci cependant de l'avoir signalé. –

Répondre

3

Il existe actuellement un bug d'outillage exceptionnel en ce qui concerne les déclencheurs de sortie ServiceBus. Il ne fonctionnera que si vous déployer votre application aux fonctions Azure, tout simplement pas localement avec l'outillage

S'il vous plaît voir les questions GitHub pertinentes ici: Service Bus output binding issue

et ici: Latest v1.0.0 not working with ServiceBus. alpha 6 still works.

Ceci est lié à la charge paresseuse. Nous ne prenons pas l'extension du bus de service, d'où l'erreur d'indexation. (Azure/azure-webjobs-sdk-script # 1637)

La raison en est que l'extension ServiceBus est différente des autres. Nous nous attendons à ce que les extensions aient un objet de configuration public sans paramètre qui implémente IExtensionConfigProvider.

SB est interne (https://github.com/Azure/azure-webjobs-sdk/blob/663a508e8a851629c26a51e7de3af36629dfd120/src/Microsoft.Azure.WebJobs.ServiceBus/Config/ServiceBusExtensionConfig.cs#L17), donc notre recherche pour ExportedTypes est manquante (voir https://github.com/Azure/azure-webjobs-sdk-script/blob/b1445485807bb190ba0716af1a8dc81a864b5228/src/WebJobs.Script/Host/ScriptHost.cs#L735). La configuration de SB n'a pas de ctor sans paramètre, donc l'appel Activator.createInstance échouera également. Ce correctif (que nous avons fait pour l'exécution du script) Azure/azure-webjobs-sdk-script # 1804 le corrigerait; mais cela devrait être tiré vers CLI.

+0

Merci! Je n'arrivais pas à trouver le bon repo pour ça. –