Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net WebApi新注册的路由表示,该请求无效_C#_Asp.net_Rest_Azure_Asp.net Web Api - Fatal编程技术网

C# ASP.net WebApi新注册的路由表示,该请求无效

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

我正在为我的Windows Phone 8.1应用程序设置后端。我正在使用ASP.net WebApi创建RESTfulapi,用于访问数据库中的数据,该api是在Windows Azure上设置的。

我的路线是这样的:

 // 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
在哪里呢?那么您希望我们如何帮助我们,从一个控制器提供代码,从另一个控制器提供错误消息?对不起,我的错。我想念你。我粘贴了错误的代码段。我说的当然是图像控制器谢谢。你的链接帮了我很多。