我正在设置ASP.net Web API,但我一直从所有Http路由中获取404。
此文件在http://localhost:52011/上运行,因为这是VS2013使用的默认位置。我添加了一个简单的测试HttpRoute,如果使用GET调用它来测试连接性,它只会返回一个字符串。
启用了目录浏览功能,以反馈Web API实际上在本地主机上,并且项目的所有目录都是可见的。
我尝试在WebApiConfig.cs的路由中设置固定的控制器名称,并阅读了很多有关HttpRoute映射的信息,但我一直收到404或“找不到与名为的控制器匹配的类型”控制器名称”。
我正在使用Postman进行测试,因为建议这样做并且易于使用。
欢迎任何提示!
WebApiConfig.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace BadgePrinter
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
//route to print badge.
config.Routes.MapHttpRoute(
name: "apiPrint",
routeTemplate: "api/{controller}/{action}/{Bedrijf}/{Aanspreektitel}/{Voornaam}/{Achternaam}/{Jobtitle}/{Kopies}/{Rijksregisternummer}/{BadgeAfdruk}/{printer}/{Image}",
defaults: new { Image = RouteParameter.Optional}
);
//test route to get string back
config.Routes.MapHttpRoute(
name: "apiTest",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
BadgeController.cs(项目中唯一的控制器)
第一种方法是我最终必须使用的方法,但是测试方法是我用于测试的方法。
using BadgePrinter.CardTemplates;
using BadgePrinter.Interfaces;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
namespace BadgePrinter.Controllers
{
public class BadgeController : ApiController
{
//removed the first method since it was big and distracting.
// test method
[HttpGet]
public IHttpActionResult GetAllProducts()
{
return Ok("some product");
}
}
}
我正在使用的测试方法的链接: http://localhost:52011/api/BadgeController/Products/1
我也尝试了此链接,即使那没关系: http://localhost:52011/api/BadgeController/Products/1
结果:
{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:52011/api/BadgeController/Products/1'.",
"MessageDetail": "No type was found that matches the controller named 'BadgeController.cs'."
}
对于其他的HttpRoute,我一直得到404,但是如果我可以进行测试,我将上天堂:) PS:我对这种东西(ASP.net和API的东西)是陌生的,所以对不起,我是个白痴。
答案 0 :(得分:0)
您在这里有2个问题:
1)您的控制器名称BadgeController
,但在您的API中,它只能是Badge
。正确的网址应为:
http://localhost:52011/api/Badge/xxx
2)我在您的代码中看不到方法名称Products
或类似名称。
3)如果它是POST
方法,则其参数输入中必须包含[FromBody]
。
答案 1 :(得分:0)
您的网址存在一些问题:
http://localhost:52011/api/BadgeController/Products/1
据我所知,您没有任何映射到ID参数的GET方法。您的控制器中只有
[HttpGet]
public IHttpActionResult GetAllProducts()
不接受任何输入。
2)记录在案的Web API约定是您没有在URL中明确编写“ Controller”。在这种情况下,仅需要控制器(Badge
)独有的第一部分。
3)我看不到您从哪里获得URL的“产品”部分。没有自定义的路线定义或属性会成为路线的一部分。同样,惯例是定义一个动作方法,该动作方法的名称以“ Get”开头,并且将映射到控制器名称的GET
请求,结尾处没有其他内容。该方法的其余名称无关紧要-并且在您的情况下,AllProducts
与/Products
始终不匹配...因此,即使有必要,它仍然是错误的。
最后,访问您的GET操作的正确URL应该是:
http://localhost:52011/api/Badge/
如果要更改现有的GetAllProducts方法,或添加类似以下的第二种方法:
[HttpGet]
public IHttpActionResult Get(int id)
{
return Ok("Product" + id);
}
然后,您可以在URL中使用ID,例如
http://localhost:52011/api/Badge/1
,它应该转到该方法。
答案 2 :(得分:-1)
尝试删除网址的控制器部分: