我有一个Web Api项目需要返回一个MVC样式的View。我已经制作了我的MVC控制器
public class MVCController: Controller
{
[HttpGet]
[Route("api/mvc/test")]
public ActionResult test()
{
return View();
}
}
但是,当我尝试从网络访问此控制器时,我似乎无法访问控制器。我收到以下错误:
{"消息":"未找到与请求URI匹配的HTTP资源' http://localhost/foo/api/mvc/test'。"," MessageDetail":"未找到与名为' mvc'的控制器匹配的类型。"}
在谷歌搜索后,人们似乎在告诉我将webapiconfig中的路由属性更改为
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
但我似乎仍然没有运气。如果我将控制器更改为webapi控制器
public class MVCController: ApiController
{
[HttpGet]
[Route("api/mvc/test")]
public IHttpActionResult test()
{
return Ok();
}
}
我可以联系到控制器..如果有人可以给我一些了解正在发生的事情,那将非常感激。
更新 阅读下面的响应后,我已将控制器更新为:
public class MVCController: Controller
{
[HttpGet]
public ActionResult test()
{
return View();
}
}
然而,localhost / MVCController / test似乎仍然给我一个404错误并且Controller没有被命中。抱歉,顺便提一下我的新手。
答案 0 :(得分:1)
我打赌你有一个名为var firsttest = function() {
return $.ajax({
url: "rest/test/testmethod1",
method: "GET"
});
};
@GET
@Path("/testmethod1")
@Produces(MediaType.APPLICATION_JSON)
public Response testMethod1(@Context HttpServletRequest request) throws JsonGenerationException,
JsonMappingException, IOException {
System.out.println("request = " + request);
if (!isUserReadOnly(request) && !isUserReadWrite(request)) {
return Response.status(Status.FORBIDDEN).build();
}
ObjectMapper mapper = new ObjectMapper();
TestResponse testResponse = new TestResponse(1, "A");
return Response.ok(mapper.writeValueAsString(testResponse)).build();
}
private boolean isUserReadOnly(HttpServletRequest request) {
HttpSession session = request.getSession(false);
Authentication authentication = (Authentication) session.getAttribute("authentication");
if (authentication == null) {
System.out.println("authentication null");
return false;
}
System.out.println(authentication.toString());
return authentication.isReadOnlyRole();
}
private boolean isUserReadWrite(HttpServletRequest request) {
HttpSession session = request.getSession(false);
Authentication authentication = (Authentication) session.getAttribute("authentication");
if (authentication == null) {
System.out.println("authentication null");
return false;
}
System.out.println(authentication.toString());
return authentication.isReadWriteRole();
}
的文件,其中包含此代码。
WebApiConfig.cs
这是为web api控制器定义路由模式的地方。因此,任何带有api / something的请求都将被视为对web api端点的请求,因为您必须在注册mvc控制器的路由之前调用WebApiConfig.Register调用。注册路线的顺序真的很重要。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
由于注册顺序很重要,当请求附带protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register); // first one
RouteConfig.RegisterRoutes(RouteTable.Routes); //second one
}
时,它将与web apis的路由注册匹配,框架将尝试寻找匹配的web api controller.s
如果您交换调用路由注册方法的顺序,您的请求将起作用。但是当您尝试访问web api控制器时,这可能会影响其他部分。
BTW,您确定要在MVC控制器的路由模式中使用api/something
吗?除非你真的想要一些不同于普通约定(api/
)的url模板,否则只需删除它自己的Route属性。使用默认路由定义,它将适用于*controllername/action*
请求。