C# ASP.net WebApi新注册的路由表示,该请求无效
我正在为我的Windows Phone 8.1应用程序设置后端。我正在使用ASP.net WebApi创建RESTfulapi,用于访问数据库中的数据,该api是在Windows Azure上设置的。 我的路线是这样的:C# ASP.net WebApi新注册的路由表示,该请求无效,c#,asp.net,rest,azure,asp.net-web-api,C#,Asp.net,Rest,Azure,Asp.net Web Api,我正在为我的Windows Phone 8.1应用程序设置后端。我正在使用ASP.net WebApi创建RESTfulapi,用于访问数据库中的数据,该api是在Windows Azure上设置的。 我的路线是这样的: // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRo
// 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;
}
private-SmokopediaContext db=new-SmokopediaContext();
//获取api/图像
公共IQueryable GetImageModels()
{
返回db.ImageModels;
}
//获取api/Images/5
[响应类型(类型(图像模型))]
公共IHttpActionResult GetImageModel(int id)
{
ImageModel ImageModel=db.ImageModels.Find(id);
if(imagemodel==null)
{
返回NotFound();
}
返回Ok(imagemodel);
}
公共IHttpActionResult GetImageModel(字符串名称)
{
ImageModel ImageModel=db.ImageModels.Find(名称);
if(imagemodel==null)
{
返回NotFound();
}
返回Ok(imagemodel);
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
db.Dispose();
}
基地。处置(处置);
}
私有布尔ImageModelExists(int id)
{
返回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>
请求无效。参数字典包含不可为空的类型“System.Int32”的参数“id”的空条目,用于“Smokopedia.Controllers.dragocontroller”中的方法“System.Web.Http.IHttpActionResult GetImageModel(Int32)”。可选参数必须是引用类型、可为null的类型或声明为可选参数。
我应该在路线中更正什么?您的url/查询在这里很重要 您可能正在使用:
http://yourapp.address/<Controller>/<name>
http://yourapp.address//
这在本次注册中不起作用。您的路由将该地址与第一个匹配的路由匹配。Ant,即DefaultApi。你必须使用
http://yourapp.address/<Controller>?name=<name>
http://yourapp.address/?name=
或更改路由。使用属性路由:
[Route("api/Images/{id:int}")]
public IHttpActionResult GetImageModel(int id){ do something}
[Route("api/Images/{id}")]
public IHttpActionResult GetImageModel(string id) {do something}
api/{controller}/{id}
和api/{controller}/{name}
之间的URI模板术语没有区别;为参数指定的任意名称不能用于解析路由
请看一个如何根据参数类型“重载”路由的示例。您是否为我们提供了正确的控制器?错误消息显示您尚未发布的
DragonController
和GetDragonModel
。是的,我发布了。我只有一个控制器,名为DragonController,上面提到了两种方法。那么GetDragonModel
在哪里呢?那么您希望我们如何帮助我们,从一个控制器提供代码,从另一个控制器提供错误消息?对不起,我的错。我想念你。我粘贴了错误的代码段。我说的当然是图像控制器谢谢。你的链接帮了我很多。