ASP.net WebApi新注册的路由说,该请求无效

时间:2014-10-09 11:57:21

标签: c# asp.net rest azure asp.net-web-api

我正在为我的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>

我的路线应该纠正什么?

3 个答案:

答案 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>

或更改您的路线。