Web API项目中未访问MVC控制器

时间:2016-04-07 16:04:01

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api

我有一个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没有被命中。抱歉,顺便提一下我的新手。

1 个答案:

答案 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*请求。