2017-09-04 1 views
1

J'utilise WebJob SDK pour créer une fonction Azure dans Visual Studio 2017 (plus précisément un Slack WebHook sortant).Exception de la fonction Azure (HttpTrigger) lors de la référence à une bibliothèque de classes standard .NET

public static async Task<HttpResponseMessage> Run(
     [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, 
     TraceWriter log) 

Je peux déboguer la fonction localement et l'exécuter avec succès.

Puis j'ajoute une référence à une nouvelle bibliothèque nouvelle classe .NET, compiler et déboguer, et lors du déclenchement de la fonction, est présenté avec l'erreur suivante.

{ 
    "id": "2badc751-bd37-4482-90db-6dde1247110c", 
    "requestId": "60acb725-546e-4e62-9868-a5bd4c217bfc", 
    "statusCode": 500, 
    "errorCode": 0, 
    "message": "Exception while executing function: SlackWebHooks -> Exception binding parameter 'req' -> No MediaTypeFormatter is available to read an object of type 'HttpRequestMessage' from content with media type 'application/x-www-form-urlencoded'.", 
    "errorDetails": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException : Exception while executing function: SlackWebHooks ---> System.InvalidOperationException : Exception binding parameter 'req' ---> System.Net.Http.UnsupportedMediaTypeException : No MediaTypeFormatter is available to read an object of type 'HttpRequestMessage' from content with media type 'application/x-www-form-urlencoded'.\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content,Type type,IEnumerable`1 formatters,IFormatterLogger formatterLogger,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Extensions.Http.HttpTriggerAttributeBindingProvider.HttpTriggerBinding.CreateUserTypeValueProvider(HttpRequestMessage request,String invokeString)\r\n at async Microsoft.Azure.WebJobs.Extensions.Http.HttpTriggerAttributeBindingProvider.HttpTriggerBinding.BindAsync(Object value,ValueBindingContext context)\r\n at async Microsoft.Azure.WebJobs.Host.Triggers.TriggeredFunctionBinding`1.BindCoreAsync[TTriggerValue](ValueBindingContext context,Object value,IDictionary`2 parameters) \r\n End of inner exception\r\n at Microsoft.Azure.WebJobs.Host.Executors.DelayedException.Throw()\r\n at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstance instance,ParameterHelper parameterHelper,TraceWriter traceWriter,ILogger logger,CancellationTokenSource functionCancellationTokenSource)\r\n at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)\r\n at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??) \r\n End of inner exception\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)\r\n at async Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.TryExecuteAsync(IFunctionInstance functionInstance,CancellationToken cancellationToken)\r\n at Microsoft.Azure.WebJobs.Host.Executors.ExceptionDispatchInfoDelayedException.Throw()\r\n at async Microsoft.Azure.WebJobs.JobHost.CallAsync(??)\r\n at async Microsoft.Azure.WebJobs.Script.ScriptHost.CallAsync(String method,Dictionary`2 arguments,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Script.WebHost.WebScriptHostManager.HandleRequestAsync(FunctionDescriptor function,HttpRequestMessage request,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Script.WebHost.Controllers.FunctionsController.ProcessRequestAsync(HttpRequestMessage request,FunctionDescriptor function,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Script.WebHost.Controllers.FunctionsController.<>c__DisplayClass3_0.<ExecuteAsync>b__0(??)\r\n at async Microsoft.Azure.WebJobs.Extensions.Http.HttpRequestManager.ProcessRequestAsync(HttpRequestMessage request,Func`3 processRequestHandler,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Script.WebHost.Controllers.FunctionsController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken)\r\n at async System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)\r\n at async System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Script.WebHost.Handlers.SystemTraceHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)\r\n at async Microsoft.Azure.WebJobs.Script.WebHost.Handlers.WebScriptHostHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)\r\n at async System.Web.Http.HttpServer.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)" 
} 

Je ne suis pas sûr de savoir pourquoi référencer la bibliothèque standard .NET changerait le comportement du SDK? Mais il est apparent qu'il est lié à MediaTypeFormatter, ou il manque de.

+0

Peut-être https://github.com/Azure/azure-webjobs-sdk-script/issues/1792? –

+0

J'ai rencontré le problème similaire lorsque j'utilise 'await req.Content.ReadAsAsync ();' pour obtenir le corps de la requête dans mon application HttpTrigger, alors que l'en-tête de la requête a le Content-Type comme application/x-www forme-urlencoded'. –

Répondre

0

Vous avez peut-être rencontré un problème similaire à celui que j'avais avec un conflit entre System.Net.Http et d'autres bibliothèques qui utilisent les extensions HttpRequest. Voir ce post.

J'ai essayé de rétrograder la version sur System.Net.Http jusqu'à la version 4.0.0, qui était la seule qui permettait à mon application de fonctionner. Je reçois toujours un avertissement concernant les exigences de version contradictoires de System.Net.Http, mais cela ne semble pas avoir d'impact sur quoi que ce soit (en sauvegardant cette discussion pour le sujet que j'ai lié). Une affiche a mentionné que pour lui, 4.3.1 pas le plus récent 4.3.2 a résolu le problème. D'autres ont mentionné qu'ils étaient en mesure de supprimer System.Net.Http entièrement car les extensions étaient incluses par d'autres paquets. Dans mon cas, je ne peux pas le supprimer car j'utilise SendGrid, ce qui m'empêche de le faire. Peut-être vouloir essayer de le supprimer ou si vous ne pouvez pas, démissionner sur la version.