2017-01-05 1 views
2

Ich habe einen "Utilities" -Controller erstellt, der an kein Modell gebunden ist und nur ungebundene Funktionen enthält.
Ich möchte in der Lage sein, diese wie folgt über eine URL aufzurufen:
OData/Öffentliche Dienstleistungen/Somemethod()OData v4 ungebundene Funktion mit benutzerdefiniertem Routing

Gerade jetzt muss ich es wie folgt nennen:
OData/Somemethod()

Wie erstelle ich eine benutzerdefinierte Route für "Dienstprogramme"?

Ich habe versucht:

[ODataRoutePrefix("Utilities")] 
public class UtilitiesController : ODataController 

Ich habe auch versucht:

[ODataRoute("Utilities/SomeMethod()"] 
public string SomeMethod() 

Aber diese beiden werfen einen Fehler:
„Der Pfad template 'Dienstprogramme/Somemethod()' auf der Die Aktion "SomeMethod" im Controller "Dienstprogramme" ist keine gültige OData-Pfadvorlage. Die Ressource wurde nicht für das Segment "Dienstprogramme" gefunden. "

Antwort

0

Sie können den Standard-Controller-Selektor überschreiben, um dies zu erreichen. Sie können eine neue Klasse erstellen, die von DefaultHttpControllerSelector wie folgt erbt:

public class CustomControllerSelector : DefaultHttpControllerSelector 
{ 

    public override string GetControllerName(HttpRequestMessage request) 
    { 
     string controllerName = null; 
     // I haven't tested this, but here you can decide whether you want to 
     // route to your new controller or not 
     if (request.ODataProperties().Path.PathTemplate == "~/UnboundFunction") 
     { 
      controllerName = "UtilitiesController"; 
     } 
     else 
     { 
      controllerName = base.GetControllerName(request); 
     } 

     return controllerName; 
    } 
} 

Und dann können Sie den Controller Wähler wie folgt ersetzen:

config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector()); 

Auf diese Weise können Sie wählen, welche Controller für jeden zur Laufzeit nutzen anfordern

+0

Dies funktioniert nicht. Wenn Sie versuchen, die URL "/ odata/Utilities/SomeMethod()" aufzurufen, erhalten Sie einen 500 Internal Server Error. Wenn Sie versuchen, "/ odata/SomeMethod()" aufzurufen, wird es in den CustomControllerSelector übernommen, aber sobald es dort ist, wird es nicht zum richtigen Controller geleitet. Sie erhalten "Es wurde kein Typ gefunden, der mit dem Controller UtilitiesController übereinstimmt". Der Controller existiert. Auch das würde Sie nicht "/ odata/Utilities/SomeMethod()" lassen, was ich versuche zu tun. – goroth

0
  1. die Controller-Klasse definieren:

    public class UtilitiesController : ODataController 
    { 
        [System.Web.Http.HttpGet] 
        [ODataRoute("SomeMethod")] 
        public string SomeMethod() 
        { 
         // add your code 
        } 
    } 
    
  2. Karte der Route:

    var config = new HttpConfiguration(); 
    
    var modelBuilder = new ODataConventionModelBuilder(); 
    
    modelBuilder.Function("SomeMethod").Returns<string>(); 
    
    config.MapODataServiceRoute("ODataRoute", "odata/Utilities", modelBuilder.GetEdmModel()); 
    
+1

Dadurch werden alle aktuellen OData-Routen geändert. Ich möchte nur eine neue benutzerdefinierte Route für den Dienstprogramme-Controller hinzufügen. – goroth

Verwandte Themen