首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.net WebApi新注册的路由说,该请求无效。

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

Stack Overflow用户
提问于 2014-10-09 11:57:20
回答 3查看 4.1K关注 0票数 2

我正在为我的Windows 8.1应用程序设置后端。我使用ASP.net WebApi来创建从DB访问数据的RESTful api,该api是在Windows .上设置的。

我的路线是这样的:

代码语言:javascript
复制
 // 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控制器的代码:

代码语言:javascript
复制
 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;
    }

最重要的代码是带有string参数的GetImageModel过载。

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

代码语言:javascript
复制
<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>

在我的路线上应该纠正什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-09 12:11:21

api/{controller}/{id}api/{controller}/{name}之间的URI模板术语没有区别;您为参数分配的任意名称不能用于解析路由。

关于如何根据参数类型“重载”路由的示例,请查看Overload web api action method based on parameter type

票数 5
EN

Stack Overflow用户

发布于 2014-10-09 12:10:49

使用属性路由:

代码语言:javascript
复制
[Route("api/Images/{id:int}")]     
public IHttpActionResult GetImageModel(int id){ do something}    

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

Stack Overflow用户

发布于 2014-10-09 12:08:01

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

您可能正在使用:

代码语言:javascript
复制
http://yourapp.address/<Controller>/<name>

这在这次注册中是行不通的。您的路由将该地址匹配到第一条匹配路由。蚂蚁,那是DefaultApi。你必须用

代码语言:javascript
复制
http://yourapp.address/<Controller>?name=<name>

或者改变你的路线。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26277841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档