Sieve
Sieve copied to clipboard
Sieve does not work with asp.net core minimal API's
Describe the bug
The new asp.net core minimal api's are not able to handle the SieveModel
To Reproduce Steps to reproduce the behaviour:
- Create a new project and use the minimal API.
- Map any Get request:
app.MapGet("/test", ([FromQuery] SieveModel model) => { });
- Start the app and make the first request to the
/test
endpoint
Expected behaviour
The app starts and binds the SieveModel
Actual behvaiour Exception is thrown:
[11:00:53 ERR] An unhandled exception has occurred while executing the request. => Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware
System.InvalidOperationException: No public static bool SieveModel.TryParse(string, out SieveModel) method found for model.
at Microsoft.AspNetCore.Http.RequestDelegateFactory.BindParameterFromValue(ParameterInfo parameter, Expression valueExpression, FactoryContext factoryContext, String source)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.CreateArgument(ParameterInfo parameter, FactoryContext factoryContext)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.CreateArguments(ParameterInfo[] parameters, FactoryContext factoryContext)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.CreateTargetableRequestDelegate(MethodInfo methodInfo, Expression targetExpression, FactoryContext factoryContext, Expression`1 targetFactory)
...
Desktop (please complete the following information):
- OS: macos
- dotnet 7.0.0-preview.7.22376.6
I was able to reproduce the issue. Is there an update on this issue?
Not to my knowledge. I worked around this problem by creating a wrapper class:
public class SieveWrapper
{
[UsedImplicitly]
[FromQuery]
public string? Filters { get; set; }
[UsedImplicitly]
[FromQuery]
public string? Sorts { get; set; }
[UsedImplicitly]
[FromQuery]
public int? Page { get; set; }
[UsedImplicitly]
[FromQuery]
public int? PageSize { get; set; }
protected SieveModel GetSieve() => new()
{
Filters = Filters,
Sorts = Sorts,
Page = Page,
PageSize = PageSize
};
}
Oh, that's smart. I tried writing a static extension method that would provide the missing TryParse. Unfortunately, .NET doesn't pick it up. I guess it was worth a try.
Now that I'm seeing your solution, I feel bad for not even thinking about just wrapping the class. Oof. Thanks for your response, I greatly appreciate a solution that doesn't require me to use FromBody haha
As an update to this topic, starting with .NET version 7 preview 5, the [AsParameters] attribute can be passed in and the SieveModel works correctly in Minimal APIs.