2016-05-25 5 views
0

Ich erstellte ein Dummy-Projekt, Odata in VS2015 zu testen, und ich hatte genau das gleiche Problem wie in dieser Frage beschrieben, und mein Code entspricht weitgehend dem, was dort beschrieben wird . Web API 2: OData 4: Actions returning 404OData Abfragen geben 404 Fehler, wenn ich einen abschließenden Schrägstrich hinzufügen

Jede Abfrage an eine gebundene Funktion gibt einen Fehler 404, bis Sie einen abschließenden Schrägstrich hinzufügen. Zum Beispiel:

http://localhost:46092/odata/v1/Trips/Default.GetTripNameById - 404 http://localhost:46092/odata/v1/Trips/Default.GetTripNameById/ - arbeitet als

erwartet

http://localhost:46092/odata/v1/Trips/Default.GetTripNameById(tripID=1) $ = Name wählen - 404 http://localhost:46092/odata/v1/Trips/Default.GetTripNameById(tripID=1)/ $ select = Name - wie erwartet funktioniert

Dies soll nicht geschehen, da? Microsoft-Dokumentation erwähnt nie, dass ein abschließender Schrägstrich erforderlich ist, ihre Beispiele sollen ohne sie funktionieren. Dies unterbricht auch die Swagger-Benutzeroberfläche, die keinen abschließenden Schrägstrich hinzufügt und 404 erhält, wenn versucht wird, eine Abfrage auszuführen.

Was könnte der Grund für dieses Verhalten sein? Wie mache ich es ohne Schrägstrich, der das normale erwartete Verhalten zu sein scheint?

Hier sind meine Code-Schnipsel:

TripsController.cs:

... 
    [HttpGet] 
    public IHttpActionResult GetTripNameById(int tripID) 
    { 
     return Ok(DemoDataSources.Instance.Trips.AsQueryable().Where(t => t.ID == tripID.ToString())); 
    } 

WebApiConfig.cs:

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

     config.MapODataServiceRoute("odata", "odata/v1", GetEdmModel()); 

DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)); 
     config.EnsureInitialized(); 
    } 

    private static IEdmModel GetEdmModel() 
    { 
     ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Person>("People"); 
     builder.EntitySet<Trip>("Trips"); 

     builder.EntityType<Trip>().Collection.Function("GetTripNameById").Returns<string>().Parameter<int>("tripID"); 

     var edmModel = builder.GetEdmModel(); 
     return edmModel; 
    } 
+0

Ich habe auch alle web.config Konfigurationsoptionen von hier versucht: http://stackoverflow.com/questions/11728846/dots- in-url-verursacht-404-mit-asp-net-mvc-und-iis - und es hatte keine Wirkung. Ich habe sie in web.debug.config in meinem VS2015-Projekt hinzugefügt. – K48

+0

web.debug.config ist der falsche Ort (wie Sie in Ihrer Antwort unten bemerken). Wie Sie wahrscheinlich wissen, wird es nur verwendet, wenn Sie Ihr Projekt bereitstellen, und Ihre Veröffentlichungseinstellungen sind so eingerichtet, dass sie die Debugkonfiguration Ihrer Lösung bereitstellen. Für die Entwicklung von lokalen Hosts wird nur das verwendet, was Sie in der Hauptdatei web.config sehen – bkwdesign

Antwort

1

Es stellt sich heraus, dass die Web.debug.config von tatsächlich ignoriert Visual Studio

Nach diesem Code zu web.config hinzufügen, alles funktioniert:

<system.webServer> 
<handlers> 
    <!-- the following line is required for correct handling of dots in URLs--> 
    <add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/odata/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 
    <!-- end line for handling of dots--> 
</handlers> 
</system.webServer> 
Verwandte Themen