2014-10-09 43 views
2

我正在为我的Windows Phone 8.1应用程序设置后端。我正在使用ASP.net WebApi创建RESTful API用于访问来自DB的数据,该DB设置在Windows Azure的上。ASP.net WebApi新注册的路线说,该请求无效

这是我的路线的样子:

// Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
     config.Routes.MapHttpRoute(
      name: "DefaultNamedApi", 
      routeTemplate: "api/{controller}/{name}", 
      defaults: new { name = RouteParameter.Optional } 
      ); 

我想要做到的,是不使用的整数 accesing数据 - 我想用一个访问数据。 这是代码从我的WebAPI控制器:

private SmokopediaContext db = new SmokopediaContext(); 

    // GET api/Images 
    public IQueryable<ImageModel> GetImageModels() 
    { 
     return db.ImageModels; 
    } 

    // GET api/Images/5 
    [ResponseType(typeof(ImageModel))] 
    public IHttpActionResult GetImageModel(int id) 
    { 
     ImageModel imagemodel = db.ImageModels.Find(id); 
     if (imagemodel == null) 
     { 
      return NotFound(); 
     } 

     return Ok(imagemodel); 
    } 
    public IHttpActionResult GetImageModel(string name) 
    { 
     ImageModel imagemodel = db.ImageModels.Find(name); 
     if(imagemodel == null) 
     { 
      return NotFound(); 
     } 
     return Ok(imagemodel); 
    } 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    private bool ImageModelExists(int id) 
    { 
     return db.ImageModels.Count(e => e.ID == id) > 0; 
    } 

最重要的代码是一个重载GetImageModel与字符串参数。

服务器返回错误,表示该URL的参数不正确:

<Error><Message>The request is invalid.</Message><MessageDetail>The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Http.IHttpActionResult GetImageModel(Int32)' in 'Smokopedia.Controllers.DragonController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.</MessageDetail></Error> 

我应该纠正我的路线?

+0

你给了我们正确的控制器吗?错误消息显示您未发布的“DragonController”和“GetDragonModel”。 – DavidG 2014-10-09 12:02:01

+0

是的,我做到了。我只有一个名为DragonController的控制器,它有两个上面提到的方法。 – 2014-10-09 12:06:47

+0

那么'GetDragonModel'在哪里? – DavidG 2014-10-09 12:07:35

回答

4

有一个在api/{controller}/{id}api/{controller}/{name}之间URI模板没有差异;您分配给参数的任意名称不能用于解析路线。

查看Overload web api action method based on parameter type,了解如何根据参数类型“重载”路线的示例。

+0

谢谢。你的链接帮了我很多。 – 2014-10-09 12:24:03

2

您的网址/查询在这里很重要。

您可能正在使用:

http://yourapp.address/<Controller>/<name> 

这将在此注册无法正常工作。您的路由将该地址与第一条匹配路由相匹配。蚂蚁是DefaultApi。您必须使用

http://yourapp.address/<Controller>?name=<name> 

或更改您的路由。

3

使用属性路由:

[Route("api/Images/{id:int}")]  
public IHttpActionResult GetImageModel(int id){ do something}  

[Route("api/Images/{id}")]  
public IHttpActionResult GetImageModel(string id) {do something}