azure-functions-openapi-extension
                                
                                 azure-functions-openapi-extension copied to clipboard
                                
                                    azure-functions-openapi-extension copied to clipboard
                            
                            
                            
                        OpenApiResponseWithBody and aliased Dictionary type triggers error: Index was outside the bounds of the array
Describe the issue
See minimal repro at https://github.com/johnnyreilly/azure-functions-openapi-extension-error-repro
Consider the following:
    public class Alias : System.Collections.Generic.Dictionary<string, string> {
    }
    public partial class IsBroken {
        public Alias? Attributes { get; set; } = default!;
    }
    public partial class IsWorking {
        public System.Collections.Generic.Dictionary<string, string>? Attributes { get; set; } = default!;
    }
IsWorking and IsBroken are effectively the same.  But they trigger different behaviour when used in concert with OpenApiResponseWithBody.  Here is IsBroken:
        [OpenApiOperation(operationId: "greeting", Summary = "Greetings", Description = "This shows a welcome message.", Visibility = OpenApiVisibilityType.Important)]
        [OpenApiParameter("name", Type = typeof(string), In = ParameterLocation.Query, Visibility = OpenApiVisibilityType.Important)]
        [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "application/json", bodyType: typeof(IsBroken), Summary = "The response", Description = "This returns the response")]
        [FunctionName("NetCoreApp31HttpTrigger")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "greetings")] HttpRequest req,
            ILogger log)
        {
            await Task.Yield();
            log.LogInformation("C# HTTP trigger function processed a request.");
            string name = req.Query["name"];
            return new OkObjectResult($"hi {name}");
        }
When you request the swagger.json you receive:
[2021-11-10T17:39:55.760Z] swagger.json was requested.
[2021-11-10T17:39:55.848Z] Index was outside the bounds of the array.
However IsWorking ... works.
        [OpenApiOperation(operationId: "greeting", Summary = "Greetings", Description = "This shows a welcome message.", Visibility = OpenApiVisibilityType.Important)]
        [OpenApiParameter("name", Type = typeof(string), In = ParameterLocation.Query, Visibility = OpenApiVisibilityType.Important)]
        [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "application/json", bodyType: typeof(IsWorking), Summary = "The response", Description = "This returns the response")]
        [FunctionName("NetCoreApp31HttpTrigger")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "greetings")] HttpRequest req,
            ILogger log)
        {
            await Task.Yield();
            log.LogInformation("C# HTTP trigger function processed a request.");
            string name = req.Query["name"];
            return new OkObjectResult($"hi {name}");
        }
To Reproduce
There's a reproduction repo here: https://github.com/johnnyreilly/azure-functions-openapi-extension-error-repro
Expected behavior
IsBroken should have the same behaviour as IsWorking - it should not trigger the "Index was outside the bounds of the array" error
Screenshots
N/A
Environment (please complete the following information, if applicable):
N/A
Additional context
Having tested historic versions of the package, it looks like it broke between 0.8.1-preview and 0.9.0-preview.  Rolling back to 0.8.1-preview makes things work.
I wonder if https://github.com/Azure/azure-functions-openapi-extension/pull/247 might be the cause?
Same issue here. just tried to use following type as bodyType public class BrokenDto : Dictionary<string, double> { }
Did you already find a workaround?
Yeah - not having aliased types. Not so much a workaround really
NSwag generated the type in question and we could do some work there to help
I'm having the same issue using a class with a Dictionary property:
public Dictionary<string, Dictionary<string, object>> Extensions { get; set; }
Having same problem with a class that contains:
public class AttributeCollection : Dictionary<string, Attribute>
v4 AF, .Net 6, VS 2022
@johnnyreilly Can you give a short hint please, how you manipulated the code produced by Nswag to not contain those alias types?
I think it's the one below @Epstone :
                    var settings = new CSharpClientGeneratorSettings
                    {
                        ClassName = "MyClient",
                        UseBaseUrl = false,
                        CSharpGeneratorSettings =
                        {
                            Namespace = "My.App",
                            GenerateNullableReferenceTypes = true,
                            GenerateOptionalPropertiesAsNullable = true,
                            GenerateNativeRecords = true,
                            InlineNamedDictionaries = true, // might have been this
                            InlineNamedArrays = true,
                            RequiredPropertiesMustBeDefined = true,
                        }
                    };
                    var generator = new CSharpClientGenerator(document, settings);
                    var code = generator
                        .GenerateFile()
I'm not sure reading through the thread was the resolution/workaround is for this? I have an existing API that uses several alias such as...
public class ParameterValueCollection : Dictionary<string, string>
How can I get these data types to be serialized correctly. I too get the error mentioned above.
[2022-09-28T00:56:47.840Z] swagger.json was requested. [2022-09-28T00:56:48.309Z] Index was outside the bounds of the array.
Facing similar exception while using System.Text.Json as the serialization/deserialization library. Is there any solution for this yet.