2015-06-09 4 views
1

Я новичок в odata. Я построил веб-интерфейс API с контроллером, как показано ниже:Odata web api 404 error

using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
using System.Web.OData.Routing; 

namespace HelloWebApi.Controllers 
{ 
public class TestsController : ODataController 
{ 
    // 
    // GET: /Product/ 

    ProductsContext db = new ProductsContext(); 
    private bool TestExists(int key) 
    { 
     return db.tests.Any(p => p.key== key); 
    } 
    protected override void Dispose(bool disposing) 
    { 
     db.Dispose(); 
     base.Dispose(disposing); 
    } 

    [EnableQuery] 
    public IQueryable<test> Get() 
    { 
     return db.tests; 
    } 

Модель, как показано ниже:

public class Test 
    { 
     [Key] 
    public int key { get; set; } 
    public string aaa { get; set; } 
} 

Я также настроен routeconfig, odataconfig, WebAPI конфигурации и global.asax файл, как показано ниже.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.Ignore("{resource}.axd/{*pathInfo}"); 
     routes.MapHttpRoute(
      name: "Default", 
      routeTemplate: "{controller}/{action}/{id}" 
     ); 
    } 
} 

public class ODataConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 
     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Test>("Tests"); 

     config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel()); 
    } 
} 

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     );   

    } 
} 

Ниже показан файл global.asax:

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     GlobalConfiguration.Configure(config => 
     { 
      ODataConfig.Register(config); //this has to be before WebApi 
      WebApiConfig.Register(config); 
     }); 
     //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
    } 
} 

Я попытался сделать много изменений. Но я получаю Http 404 не найдена ошибка. Я попытался добавить атрибут [ODataRoute] к имени метода действия. При этом я получаю Http 406 неприемлемый ответ.

URL-адрес, который я пытаюсь: http://localhost:6701/odata/tests/ где odata - это суффикс, а тесты - имя контроллера. Пожалуйста, предложите, что я делаю неправильно.

ответ

3

Маршруты, сконфигурированные с помощью ODataConventionModelBuilder, чувствительны к регистру. В коде, вы определили:

builder.EntitySet<Test>("Tests"); 

Исходя из этого, конечная точка будет http://localhost:6701/odata/Tests/ (обратите внимание на верхний регистр «T» в «тестах»).

Это по дизайну, чтобы поддерживать совместимость с спецификацией OData.

При этом, по состоянию на Web API OData 5.4, вы можете дополнительно разрешить нечувствительные к регистру маршруты с использованием метода HttpConfiguration класса EnableCaseInsensitive(). Например, в методе ODataConfig.Register() можно добавить:

config.EnableCaseInsensitive(caseInsensitive: true); 

Для получения дополнительной информации см Basic Case Insensitive Support под Microsoft, ASP.NET Web API for OData V4 Docs.

+1

С [API API OData 5.4] (https://www.nuget.org/packages/Microsoft.AspNet.OData/5.4.0) теперь не поддерживается регистр без учета регистра. [Здесь] (http://odata.github.io/WebApi/#06-01-custom-url-parsing) - простая примерная страница. Спасибо. :) –

+0

Уважаемый Джереми, Большое спасибо за ваше предложение. Теперь я могу ударить точку останова в контроллере, используя указанный вами URL. Однако теперь ответ приходит, поскольку HTTP 406 неприемлем. –

+0

Привет, Сэм, Большое вам спасибо за то, что разделил этот URL. Случай тот же (HTTP 406) один раз, когда я применил caseInsensitive: true. –