我正在为我的Windows Phone 8.1 App设置后端。我正在使用 ASP.net WebApi 创建 RESTful API来访问数据库,该数据库是在 Windows Azure上设置的。 < / p>
这是我的路线的样子:
// 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 }
);
我想要实现的是使用整数访问数据 - 我想使用字符串访问数据。 这是来自我的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 :(得分:4)
api/{controller}/{id}
和api/{controller}/{name}
之间的URI模板术语没有区别;您分配给参数的任意名称不能用于解析路径。
请查看Overload web api action method based on parameter type,了解如何超载&#34;基于参数类型的路由。
答案 1 :(得分:3)
使用属性路由:
[Route("api/Images/{id:int}")]
public IHttpActionResult GetImageModel(int id){ do something}
[Route("api/Images/{id}")]
public IHttpActionResult GetImageModel(string id) {do something}
答案 2 :(得分:2)
您的网址/查询非常重要。
您可能正在使用:
http://yourapp.address/<Controller>/<name>
这不适用于此注册。您的路由将该地址与第一个匹配的路由匹配。 DefaultApi 的Ant。你必须使用
http://yourapp.address/<Controller>?name=<name>
或更改您的路线。