developer tip

ASP.NET MVC WebAPI 404 오류

copycodes 2020. 11. 29. 11:51
반응형

ASP.NET MVC WebAPI 404 오류


v4.0 통합 모드에서 실행되는 asp.net 웹 양식 응용 프로그램이 있습니다.

App_Code 폴더에 apicontroller를 추가하려고했습니다.

Global.asax에 다음 코드를 추가했습니다.

 RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

에서 컨트롤러로 이동하려고 http://localhost/api/Value하면 404 오류가 발생합니다.

확장이없는 URL은 핸들러 섹션에서 구성됩니다. 웹 사이트에 대해 양식 및 익명 인증을 활성화했습니다.

ExtensionLess URL이 '*'로 구성되었습니다.

컨트롤러의 URL을 누르면 요청이 ExtensionlessUrlHandler-Integrated-4.0 대신 StaticHandler에 의해 처리됩니다.

아래 이미지와 같이 시스템에서 오류가 발생하는 이유를 알 수 없습니다. 오류


이 문제가 발생했습니다.

WebApiConfig.cs여기에서 여러 권장 사항을 충족하고 다른 곳에서 샘플을 코드화하기 위해 편집하려고했습니다 . 일부는 작동했지만 WebApiConfig.csMS 템플릿 WebApi 프로젝트에 따라 정확히 코딩 되었을 때 경로가 작동하지 않는 이유를 설명하지 못했습니다 .

내 실제 문제는 수동으로 WebApi프로젝트에 추가 할 때 구성 호출의 재고 순서를 따르지 않았다는 것입니다.Global.asax

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // This is where it "should" be
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        // The WebApi routes cannot be initialized here.
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

왜 그런지 추측 할 수 있었지만 더 이상 조사하지 않았습니다. 최소한으로 말하는 것은 직관적이지 않았습니다.


문제는 라우팅 구성에 있습니다. Mvc라우팅은 라우팅과 다릅니다 WebApi.

에 대한 참조를 추가 System.Web.Http.dll, System.Web.Http.Webhost.dll그리고 System.Net.Http.dll다음과 같이 라우팅 당신의 API를 구성 다음과 :

   GlobalConfiguration.Configuration.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
   );

다음 사항을 확인하십시오.

1.) 웹 API가 4.5 인 경우 IIS가 .NET 4.5 또는 4.0으로 구성되어 있는지 확인하십시오. IIS에 4.5를 설치하십시오.

관리자 권한으로 명령 프롬프트에서이 명령을 실행하십시오.

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i

2.) 경로 변경

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

Demo / Get으로 요청합니다 (여기서 demo는 컨트롤러 이름입니다).

1,2가 작동하지 않으면 3을 시도하십시오.

3.) web.config 파일에 다음 구성 추가

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

</system.webServer>

또한 컨트롤러가 "PizzaPieController"에서와 같이 "Controller"라는 이름으로 끝나는 지 확인하십시오.


위의 모든 것을 시도했지만 동일한 문제가 발생했습니다. IIS에서 생성 된 앱 풀의 기본값은 .net 2.0입니다. 4.0으로 변경하면 다시 작동했습니다.


감사합니다 Shannon, 잘 작동합니다 =>

내 Global.asax의 주문은 다음과 같습니다.

GlobalConfiguration.Configure(WebApiConfig.Register);  
RouteConfig.RegisterRoutes(RouteTable.Routes);

좋은 것 대신 :

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register); 

또한 전체 api bin 폴더의 내용을 삭제하십시오. 내 이름은 충돌하는 컨트롤러를 노출하는 오래된 dll (큰 네임 스페이스 이름 변경으로 인해)을 포함하고있었습니다. 해당 dll은 Visual Studio의 정리 기능에 의해 삭제되지 않았습니다.

(그러나 asp.net 웹 API에는 디버깅 수준에서 라우팅 및 디버깅 정보가 심각하게 부족합니다.)


App_Code에서 컨트롤러를 생성하면 라우팅 테이블이 위치를 어떻게 알 수 있습니까? 경로를 "api / {controller / ..."로 지정했지만 컨트롤러가있는 위치가 아닙니다. 올바른 폴더로 이동해보십시오.


이것에 시간을 보낸 후, 제 경우에 이것에 대한 해결책을 찾았습니다.

RouteConfig에 경로를 등록하는 순서 였습니다 .

We should be registering the HttpRoute in the Route table before the Default controller route . It should be as follows. Route Config Route table configuration

  public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
         );
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

    }
}

For the URL you've trying (http://localhost/api/Value) make sure there's a public type named ValueController which derives from ApiController and has a public method with some of these characteristics:

  • Method name starts with Get (e.g. GetValues or simply Get).
  • There's an HttpGet attribute applied to the method.

In case you're trying the code from the default Web API project template, the name of the controller is ValuesController, not ValueController so the URL will be http://localhost/api/values.

If non of the above helps, you may want to enable tracing which can give you a useful insight on where in the pipeline the error occurs (as well as why).

Hope this helps.


I copied a RouteAttribute based controller dll into the bin folder, but it wasn't getting recognized as a valid controller and I was getting the 404 error on the client.

After much debugging, I found my problem. It was because the version of System.Web.Http.dll that the controller was referencing was different from the version of System.Web.Http.dll that the main project (the one containing global.asax.cs) was referencing.

Asp.Net finds the controller by reflection using code like this

internal static bool IsControllerType(Type t)
{
    return
        t != null &&
        t.IsClass &&
        t.IsVisible &&
        !t.IsAbstract &&
        typeof(IHttpController).IsAssignableFrom(t) &&
        HasValidControllerName(t);
}

Since IHttpController is different for each version of System.Web.Http.dll, the controller and the main project have to have the same reference.


We had this as well, changing .NET version from 4.5 to 4.5.1 or newer solved the issue


Try just using the Value part of the controller name, like this:

http://localhost/api/Value

Note: By convention, the routing engine will take a value passed as a controller name and append the word Controller to it. By putting ValueController in the URI, you were having the routing engine look for a class named ValueControllerController, which it did not find.


Your route configuration looks good. Double check the handlers section in web.config, for integrated mode this is the proper way to use ExtensionLessUrlHandler:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

More on this topic: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx


None of solutions above solved my problem... My error was that I copied the bin files directly to production server, and then, I don't work. The 404 was gone when I publish the project to disk and copied the "published" folder to server. It's a little obvious, but, can help some one.


Time for me to add my silly oversight to the list here: I mistyped my webapi default route path.

Original:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/id",
            defaults: new { id = RouteParameter.Optional}
        );

Fixed: (observe the curly braces around "id")

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional}
        );

I appreciate this is a very old question but I thought I would add another answer for future users.

I found this to happen just now in a project I was working on only after it was deployed to CI/Staging. The solution was to toggle the compilation debug="true" value back and forth while deploying each version to each environment once, and it would fix itself for me.


제 경우에는 ApiController에서 파생시키는 것을 잊었습니다.

그래서 그것은

public class ValuesController : ApiController

경로를 등록하는 순서는 내 Application_Start ()의 문제였습니다. 나를 위해 일한 시퀀스는

AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

이전에는

AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

참고 URL : https://stackoverflow.com/questions/20621825/asp-net-mvc-webapi-404-error

반응형