Ich habe ein Web-API-Projekt, das seit mehreren Jahren ohne OData-Unterstützung verwendet wird, nur mit Standard-URL-Parametern.Unterstützung von ODataQueryOptions in bestehenden Web-API
Ich möchte nun OData-Unterstützung zu dieser API hinzufügen, aber da die API nicht auf einem abfragbaren Modell aufgebaut ist, ist die Absicht, das ODataQueryOptions<T>
-Objekt zu empfangen und an ein Repository weiterzuleiten.
Alles, was ich über die Unterstützung von OData lesen kann, setzt entweder voraus, dass ich ein abfragbares Modell habe, oder es ist zu einfach und sagt mir einfach, wie ich das Objekt ODataQueryOptions
verstehen kann. Folglich kann ich keine einfache Methode zum Laufen bringen.
Hier ist, was ich derzeit habe.
[Route("test")]
[HttpGet]
[EnableQuery]
public IHttpActionResult Test(ODataQueryOptions<TestOptions> options)
{
var settings = new ODataValidationSettings {
AllowedFunctions = AllowedFunctions.None,
AllowedLogicalOperators = AllowedLogicalOperators.Equal,
AllowedArithmeticOperators = AllowedArithmeticOperators.None,
AllowedQueryOptions = AllowedQueryOptions.Filter
};
try
{
options.Validate(settings);
}
catch (ODataException exception)
{
return BadRequest(exception.Message);
}
var binaryOperator = options.Filter?.FilterClause?.Expression as BinaryOperatorNode;
if (binaryOperator != null)
{
var property = binaryOperator.Left as SingleValuePropertyAccessNode ?? binaryOperator.Right as SingleValuePropertyAccessNode;
var constant = binaryOperator.Left as ConstantNode ?? binaryOperator.Right as ConstantNode;
if (property?.Property != null && constant?.Value != null)
{
;
}
}
return Ok();
}
Die TestOptions
-Klasse (im ODataQueryOptions<TestOptions>
param) ist derzeit eine leere Klasse:
public class TestOptions
{
}
ich auch
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// existing code
config.AddODataQueryFilter();
}
}
jedoch hinzugefügt haben, auf diese von einer REST-API-Aufruf Klient ...
{
"Nachricht": "Ein Fehler ist aufgetreten.",
"ExceptionMessage": "Keine nicht OData HTTP-Route registriert.“,
"Exception": "System.InvalidOperationException",
"Stacktrace": "..."
}
Was habe ich verpasst Ich hätte gedacht, dass ich vielleicht registrieren? OData-fähige Methoden in den global.asax oder ähnlich, aber die Ausnahme bedeutet, dass das Problem mit nicht-OData Methoden ist, aber alle anderen Methoden geben nach wie vor als erwartet (dh ohne OData Beteiligung).
Ich denke, dass die Fehlermeldung hier etwas irreführend ist und dass Sie die OData-Route registrieren müssen. Befolgen Sie die Anweisungen hier sollten Sie beginnen: https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an -odata-v4-endpoint – TomDoesCode
Dieses Beispiel basiert auf einem EF-Modell und wie ich im OP sagte, habe ich kein zugrunde liegendes Modell. Im Beispiel wird der OData-Endpunkt mit bestimmten Details seines Modells registriert: https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-a-odata-v4-Endpunkt # configure-the-odata-Endpunkt – awj
OK, Sie müssen dennoch ein Modell erstellen, auch wenn es nicht über das Entity-Framework erfolgt. Wird Ihr Modell zur Kompilierzeit definiert? Werden sich die Typen und Eigenschaften, die ausgesetzt sind, ändern? – TomDoesCode