2017-09-04 102 views
1

我正在使用WebJob SDK在Visual Studio 2017(特别是传出的Slack WebHook)中创建Azure函数。引用.NET标准类库时的Azure函数(HttpTrigger)异常

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

我可以在本地调试该函数,并成功执行它。

然后我添加一个对新的 NET标准类库的引用,编译和调试,并且在触发函数时,出现以下错误。

{ 
    "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)" 
} 

我不确定为什么引用.NET标准库会改变SDK的行为?但很明显这与MediaTypeFormatter有关,或者缺乏。

+0

也许https://github.com/Azure/azure-webjobs-sdk-script/issues/1792? –

+0

当我使用'await req.Content.ReadAsAsync ();'在我的HttpTrigger函数应用程序中获取请求主体时,遇到了类似的问题,而请求标头具有'Content-Type'作为'application/x-www-外形urlencoded'。 –

回答

0

你可能会遇到类似的问题,我有System.Net.Http和其他使用HttpRequest扩展的库之间的冲突。看到这post.

我试着将System.Net.Http上的版本降级到4.0.0,这是唯一一个允许我的应用程序工作的版本。我仍然收到了有关System.Net.Http版本要求冲突的警告,但它似乎没有影响任何内容(保存关于我链接的主题的讨论)。一张海报提到对他来说,4.3.1不是最新的4.3.2修复了这个问题。其他人提到他们能够完全移除System.Net.Http,因为其他软件包中包含扩展。在我的情况下,我不能删除它,因为我使用SendGrid,这阻止了我这样做。可能想尝试删除它,或者如果你不能,请降低版本。