Przekształcałem projekt C# webapi w F # przy użyciu szablonów F # ASP.NET. Wszystko działa świetnie, z wyjątkiem opcjonalnych parametrów zapytania. Wciąż otrzymuję ten błądUżywanie opcjonalnych parametrów zapytania w projekcie F # Web Api
{
"message": "The request is invalid.",
"messageDetail": "The parameters dictionary contains an invalid entry for parameter 'start' for method 'System.Threading.Tasks.Task`1[System.Net.Http.HttpResponseMessage] GetVendorFiles(Int32, System.Nullable`1[System.DateTime])' in 'Thor.WebApi.VendorFilesController'. The dictionary contains a value of type 'System.Reflection.Missing', but the parameter requires a value of type 'System.Nullable`1[System.DateTime]'."
}
F # Funkcja Podpis:
[<HttpGet; Route("")>]
member x.GetVendorFiles([<Optional; DefaultParameterValue(100)>] count, [<Optional; DefaultParameterValue(null)>] start : Nullable<DateTime>) =
C# Funkcja Podpis:
[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> GetVendorFiles(int count = 100,DateTime? start = null)
Czy ktoś zna jakieś obejścia?
Aktualizacja: Pomyślałem przyczynę tego problemu. Program ASP.NET wyodrębnia wartości domyślne dla działań kontrolera using ParameterInfo. Wygląda na to, że kompilator F # nie kompiluje wartości domyślnych w taki sam sposób, jak C# (nawet z DefaultParameterValueAttribute
). Jest to najlepszy sposób na obejście tego problemu. Czy byłby to jakiś filtr, który muszę wstrzyknąć lub zaimplementować mój własny ParameterBinding
?
Czy można określić parametry domyślne na określonej trasie dla metody kontrolera? 'routes.MapRoute (name:" Default ", url:" MyController/GetVendorFiles/{count}/{start} ", domyślnie: nowy {count = 100, start = (DateTime?) null});' – DLeh
@DLeh Not tak naprawdę, ponieważ istniejąca aplikacja front end używa liczby i zaczyna się jako parametry zapytania (nie parametry trasy), więc chciałbym, aby była zgodna z istniejącym kodem. Najgorszy przypadek mogę zmienić na ten – Pavel
Po prostu zauważyłem, że @Pavel podniósł to jako [problem Mvc] (https://github.com/aspnet/Mvc/issues/1923). Problem zawiera dalszą dyskusję i obejście. – bentayloruk