【发布时间】:2016-07-05 13:08:03
【问题描述】:
我正在尝试创建一个既是 MVC 又是 Web Api 的 ASP.NET 应用程序。默认控制器 (HomeController) 返回一个由一些 HTML 和 jQuery 组成的视图。我想使用 jQuery 来调用属于同一项目的 API。
我已经设置了 API,并且一直在使用 Postman 对其进行测试,但在尝试访问 API 中的端点时出现以下错误。
{
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:19925/api/encryption/encrypt'.",
"MessageDetail": "No action was found on the controller 'Values' that matches the request."
}
我正在尝试使用属性路由,所以我很确定这是我出错的地方。
[RoutePrefix("api/encryption")]
public class ValuesController : ApiController
{
[HttpPost]
[Route("encrypt")]
public IHttpActionResult EncryptText(string plainText, string keyPassPhrase)
{
// Method details here
return Ok(cipherText);
}
}
我将路由前缀设置为api/encryption。我也有使用路由encrypt 并标记为HttpPost 的方法。下面是我的 WebApiConfig,我认为它已为属性路由正确配置。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
// Default MVC routing
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
据我了解,POST 到以下 URL 应该到达方法..
http://localhost:19925/api/encryption/encrypt
但事实并非如此。我通过 Postman 将两个字符串值发布到方法中。我附上了一个屏幕截图(是的,keyPassPhrase 是假的)。
这是要求的 global.asax ...
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
要注意的另一件事......当我在 Postman 中从 GET 更改为 POST 时,它可以工作......只要我在查询字符串中发送参数。如果我在正文中发送参数,则会收到原始错误。
【问题讨论】:
-
您正在使用的
[Route]和[HttpPost] 属性的完整命名空间是什么? -
命名空间是
namespace EncryptionDemo.Controllers。 ValuesController 是 ASP.NET 项目生成的默认控制器。我刚刚删除了 Index 方法并添加了我自己的方法。 -
我询问了
[Route]和[HttpPost]属性的完整命名空间。不是控制器... -
对不起我的错误。 [HttpPost] =
HttpPostAttribute.HttpPostAttribute()和 [Route("encrypt")] =RouteAttribute.RouteAttribute(string template) -
这还不是完整的命名空间。确保您使用的是位于
System.Web.Http而不是System.Web.Mvc中的那些。可悲的是,他们的名字完全相同
标签: asp.net-mvc asp.net-web-api2 attributerouting