Azure / azure-functions-openapi-extension

This extension provides an Azure Functions app with Open API capability for better discoverability to consuming parties
https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi/
MIT License
360 stars 190 forks source link

Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore and OpenApi extension #617

Open safigi opened 9 months ago

safigi commented 9 months ago

Describe the issue When I create a new Function App dotnet core 6.0 Isolated app and I am using the following nuget package: Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore and I am changing in the Program.cs this line: var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(worker => worker.UseNewtonsoftJson()) .Build(); to this var host = new HostBuilder() .ConfigureFunctionsWebApplication(worker => worker.UseNewtonsoftJson()) .Build(); , and I am trying to open the URL openapi UI I don't get any data.

To Reproduce Steps to reproduce the behavior: project attached to the report.

Expected behavior I would like to use openapi extension with Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore nuget package.

Screenshots

Environment (please complete the following information, if applicable):

Additional context

FunctionApp1.zip

HalinSky commented 8 months ago

We are also encountering the same issue.

Judas1337 commented 8 months ago

Edit: after checking how ...Http.AspNetCore returns errors for how HttpRequestData.Url is handled (it has thrown a UriFormatException), I found that the currently latest commit (https://github.com/Azure/azure-functions-dotnet-worker/commit/bf56b378eecc0499aa86a89ae33ae6b1692b9f2d) might attempting to solve this issue.

We have also been dealing with the what could be the same problem for 2 days now. When going to "http://localhost:{port}/api/swagger.json" or "/api/swagger/ui" we get the error message below. It states One or more errors occurred. (Invalid URI: The URI is empty.).

Our best guess is that it's due to ConfigureAspNetCoreIntegration in https://github.com/Azure/azure-functions-dotnet-worker/blob/main/extensions/Worker.Extensions.Http.AspNetCore/src/FunctionsHostBuilderExtensions.cs Here it's stated webBuilder.UseUrls(HttpUriProvider.HttpUriString); and HttpUriProvider is implemented as a string backed by a Lazy Uri in https://github.com/Azure/azure-functions-dotnet-worker/blob/main/extensions/Worker.Extensions.Http.AspNetCore/src/HttpUriProvider.cs But we actually do not know what Uri is supposed to be read at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.HttpRequestObject..ctor. https://github.com/Azure/azure-functions-openapi-extension/blob/main/src/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/HttpRequestObject.cs

The open api generation actually works fine if I don't use ConfigureFunctionsWebApplication and instead uses ConfigureFunctionsWorkerDefaults but this contradicts with what is stated here: https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide#aspnet-core-integration


[2023-10-31T14:42:56.448Z] swagger.json was requested.
[2023-10-31T14:42:56.490Z] Function 'RenderSwaggerDocument', Invocation id 'c21663e9-7129-4b63-a9b7-8c85dd259aa6': An exception was thrown by the invocation.
[2023-10-31T14:42:56.492Z] Result: Function 'RenderSwaggerDocument', Invocation id 'c21663e9-7129-4b63-a9b7-8c85dd259aa6': An exception was thrown by the invocation.
Exception: System.AggregateException: One or more errors occurred. (Invalid URI: The URI is empty.)
[2023-10-31T14:42:56.493Z]  ---> System.UriFormatException: Invalid URI: The URI is empty.
[2023-10-31T14:42:56.493Z]    at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind, UriCreationOptions& creationOptions)
[2023-10-31T14:42:56.494Z]    at System.Uri..ctor(String uriString)
[2023-10-31T14:42:56.495Z]    at Microsoft.Azure.Functions.Worker.GrpcHttpRequestData.get_Url() in D:\a\_work\1\s\src\DotNetWorker.Grpc\Http\GrpcHttpRequestData.cs:line 101
[2023-10-31T14:42:56.496Z]    at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.HttpRequestObject..ctor(HttpRequestData req)
[2023-10-31T14:42:56.497Z]    at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Functions.OpenApiTriggerFunction.RenderSwaggerDocument(HttpRequestData req, String extension, FunctionContext ctx)
[2023-10-31T14:42:56.498Z]    at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.DefaultOpenApiHttpTrigger.RenderSwaggerDocument(HttpRequestData req, String extension, FunctionContext ctx)
[2023-10-31T14:42:56.499Z]    --- End of inner exception stack trace ---
[2023-10-31T14:42:56.501Z]    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
[2023-10-31T14:42:56.502Z]    at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
[2023-10-31T14:42:56.503Z]    at System.Threading.Tasks.Task1.get_Result()
[2023-10-31T14:42:56.504Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionInvoker2.<>c.<InvokeAsync>b__6_0(Task1 t) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionInvoker.cs:line 32
[2023-10-31T14:42:56.505Z]    at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()
[2023-10-31T14:42:56.506Z]    at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
[2023-10-31T14:42:56.506Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.507Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.508Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.508Z]    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
[2023-10-31T14:42:56.509Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.510Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 45
[2023-10-31T14:42:56.515Z]    at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13
[2023-10-31T14:42:56.516Z]    at Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.FunctionsHttpProxyingMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\extensions\Worker.Extensions.Http.AspNetCore\src\FunctionsMiddleware\FunctionsHttpProxyingMiddleware.cs:line 48
[2023-10-31T14:42:56.517Z]    at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 77
Stack:    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
[2023-10-31T14:42:56.518Z]    at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
[2023-10-31T14:42:56.521Z]    at System.Threading.Tasks.Task1.get_Result()
[2023-10-31T14:42:56.522Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionInvoker2.<>c.<InvokeAsync>b__6_0(Task1 t) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionInvoker.cs:line 32
[2023-10-31T14:42:56.523Z]    at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()
[2023-10-31T14:42:56.523Z]    at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
[2023-10-31T14:42:56.524Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.525Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.525Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.528Z]    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
[2023-10-31T14:42:56.529Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.531Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 45
[2023-10-31T14:42:56.535Z]    at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13
[2023-10-31T14:42:56.539Z]    at Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.FunctionsHttpProxyingMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\extensions\Worker.Extensions.Http.AspNetCore\src\FunctionsMiddleware\FunctionsHttpProxyingMiddleware.cs:line 48

[2023-10-31T14:42:56.540Z] Executed 'Functions.RenderSwaggerDocument' (Failed, Id=c21663e9-7129-4b63-a9b7-8c85dd259aa6, Duration=400ms)
[2023-10-31T14:42:56.541Z]    at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 77.
[2023-10-31T14:42:56.544Z] System.Private.CoreLib: Exception while executing function: Functions.RenderSwaggerDocument. System.Private.CoreLib: Result: Failure
Exception: System.AggregateException: One or more errors occurred. (Invalid URI: The URI is empty.)
[2023-10-31T14:42:56.546Z]  ---> System.UriFormatException: Invalid URI: The URI is empty.
[2023-10-31T14:42:56.547Z]    at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind, UriCreationOptions& creationOptions)
[2023-10-31T14:42:56.547Z]    at System.Uri..ctor(String uriString)
[2023-10-31T14:42:56.548Z]    at Microsoft.Azure.Functions.Worker.GrpcHttpRequestData.get_Url() in D:\a\_work\1\s\src\DotNetWorker.Grpc\Http\GrpcHttpRequestData.cs:line 101
[2023-10-31T14:42:56.549Z]    at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.HttpRequestObject..ctor(HttpRequestData req)
[2023-10-31T14:42:56.549Z]    at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Functions.OpenApiTriggerFunction.RenderSwaggerDocument(HttpRequestData req, String extension, FunctionContext ctx)
[2023-10-31T14:42:56.550Z]    at Microsoft.Azure.Functions.Worker.Extensions.OpenApi.DefaultOpenApiHttpTrigger.RenderSwaggerDocument(HttpRequestData req, String extension, FunctionContext ctx)
[2023-10-31T14:42:56.551Z]    --- End of inner exception stack trace ---
[2023-10-31T14:42:56.552Z]    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
[2023-10-31T14:42:56.552Z]    at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
[2023-10-31T14:42:56.553Z]    at System.Threading.Tasks.Task1.get_Result()
[2023-10-31T14:42:56.553Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionInvoker2.<>c.<InvokeAsync>b__6_0(Task1 t) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionInvoker.cs:line 32
[2023-10-31T14:42:56.554Z]    at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()
[2023-10-31T14:42:56.555Z]    at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
[2023-10-31T14:42:56.556Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.558Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.560Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.560Z]    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
[2023-10-31T14:42:56.561Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.562Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 45
[2023-10-31T14:42:56.563Z]    at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13
[2023-10-31T14:42:56.567Z]    at Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.FunctionsHttpProxyingMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\extensions\Worker.Extensions.Http.AspNetCore\src\FunctionsMiddleware\FunctionsHttpProxyingMiddleware.cs:line 48
[2023-10-31T14:42:56.568Z]    at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 77
[2023-10-31T14:42:56.569Z]    at Microsoft.Azure.Functions.Worker.Handlers.InvocationHandler.InvokeAsync(InvocationRequest request) in D:\a\_work\1\s\src\DotNetWorker.Grpc\Handlers\InvocationHandler.cs:line 88
Stack:    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
[2023-10-31T14:42:56.570Z]    at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
[2023-10-31T14:42:56.570Z]    at System.Threading.Tasks.Task1.get_Result()
[2023-10-31T14:42:56.571Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionInvoker2.<>c.<InvokeAsync>b__6_0(Task1 t) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionInvoker.cs:line 32
[2023-10-31T14:42:56.575Z]    at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()
[2023-10-31T14:42:56.576Z]    at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
[2023-10-31T14:42:56.577Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.578Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.579Z]    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
[2023-10-31T14:42:56.580Z]    at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
[2023-10-31T14:42:56.580Z] --- End of stack trace from previous location ---
[2023-10-31T14:42:56.581Z]    at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 45
[2023-10-31T14:42:56.582Z]    at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13
[2023-10-31T14:42:56.582Z]    at Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.FunctionsHttpProxyingMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\_work\1\s\extensions\Worker.Extensions.Http.AspNetCore\src\FunctionsMiddleware\FunctionsHttpProxyingMiddleware.cs:line 48
[2023-10-31T14:42:56.583Z]    at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a\_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 77
[2023-10-31T14:42:56.584Z]    at Microsoft.Azure.Functions.Worker.Handlers.InvocationHandler.InvokeAsync(InvocationRequest request) in D:\a\_work\1\s\src\DotNetWorker.Grpc\Handlers\InvocationHandler.cs:line 88```
olegrotar commented 6 months ago

+1. Also having this issue

MohdmM01 commented 6 months ago

I am also having this issue with Open API extension when using ASP.Net core integration for Isolated Process Functions.

ValeNaldi commented 4 months ago

+1 for the same issue. Any workaround?

Joeghanoe commented 2 months ago

+1 also having this issue, currently no workaround :/