programing

ASP.NET MVC WebAPI 404 오류

closeapi 2023. 6. 30. 22:23
반응형

ASP.NET MVC WebAPI 404 오류

v4.0 통합 모드에서 실행 중인 asp.net 웹 양식 애플리케이션이 있습니다.

App_Code 폴더에 어댑터 컨트롤러를 추가하려고 했습니다.

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

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

에서 할때.http://localhost/api/Value404 오류가 발생했습니다.

확장자 없는 URL은 처리기 섹션에서 구성됩니다.웹 사이트에 대해 양식 및 익명 인증을 사용할 수 있습니다.

ExtensionLess URL이 '*'에 대해 구성되었습니다.

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

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

저는 이 문제를 겪고 있었습니다.

는 제 편을시니다습했을 해 보았습니다.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과 같이

   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으로 구성되어 있는지 확인합니다.

관리자 권한으로 명령 프롬프트에서 이 명령 실행

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>

또한 "피자파이 컨트롤러"에서와 같이 컨트롤러 이름이 "컨트롤러"로 끝나는지 확인합니다.

저는 위의 모든 것을 시도해 보았지만 같은 문제가 있었습니다.IIS에서 생성된 앱 풀은 기본적으로 .net 2.0으로 설정되었습니다.4.0으로 변경했을 때 다시 작동했습니다.

고마워요, 섀넌, 잘 작동해요 =>

내 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에 Route를 등록하는 순서였습니다.

기본 컨트롤러 경로보다 먼저 Route 테이블에 HttpRoute를 등록해야 합니다.그것은 다음과 같아야 합니다.Route Config Route 테이블 구성

  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 }
        );

    }
}

Shannon, ceinpap, Shri Guru 덕분에 다음과 같은 수정 작업이 가능합니다.

  1. WebApiConfig.cs:

    public static void Register(HttpConfiguration config)
    {
        ...
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
    
  2. Global.asax.cs:

    protected void Application_Start()
    {
        ...
        GlobalConfiguration.Configure(WebApiConfig.Register);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ...
    }
    

시도하고 에 대해서는 (URL의 경우)http://localhost/api/Value)라는 이름의 ValueController은 서에유래에서 한 것입니다.ApiController과 같은을 가지고 있습니다.

  • 메서드 이름은 다음으로 시작합니다.Get (예:)GetValues아니면 간단히Get).
  • 있다니라는 게 HttpGet메서드에 적용된 특성입니다.

기본 웹 API 프로젝트 템플릿의 코드를 시도하는 경우 컨트롤러의 이름은ValuesController,것은 아니다.ValueController은 "서은래 URL"이 될 것입니다.http://localhost/api/values.

위의 항목이 도움이 되지 않는 경우 파이프라인에서 오류가 발생하는 위치(이유)에 대한 유용한 통찰력을 제공하는 추적을 활성화할 수 있습니다.

이게 도움이 되길 바랍니다.

위의 어떤 해결책도 제 문제를 해결하지 못했습니다.실수는 bin 파일을 생산 서버에 직접 복사한 후 작업을 하지 않는 것입니다.프로젝트를 디스크에 게시하고 "게시된" 폴더를 서버에 복사했을 때 404가 사라졌습니다.그것은 약간 명백하지만, 누군가를 도울 수 있습니다.

복사했습니다.RouteAttribute폴더에 controller dll bin 가 발생했습니다.

많은 디버깅을 한 후, 저는 제 문제를 발견했습니다.은 그은버전버전의 때문이었습니다.System.Web.Http.dll하는 버전이 컨롤러참버다릅다니전의 .System.Web.Http.dll메인 프로젝트(global.asax.cs 가 포함된 프로젝트)가 참조하고 있었습니다.

As.Net은 다음과 같은 코드를 사용하여 반사를 통해 컨트롤러를 찾습니다.

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

부터IHttpController의 각 버전마다 다릅니다.System.Web.Http.dll컨트롤러와 기본 프로젝트는 동일한 참조를 가져야 합니다.

.NET 버전을 4.5에서 4.5.1 이상으로 변경하여 문제를 해결했습니다.

경로를 등록하는 순서는 나의 Application_Start()의 문제였습니다. 나에게 효과가 있었던 순서는

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

더 일찍

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

사용해 보십시오.Value다음과 같은 컨트롤러 이름의 일부입니다.

http://localhost/api/Value

참고: 관례에 따라 라우팅 엔진은 컨트롤러 이름으로 전달된 값을 사용하고 단어를 추가합니다.Controller그것에. 퍼팅으로.ValueControllerURI에서, 당신은 라우팅 엔진이 이름이 붙은 클래스를 찾도록 하고 있었습니다.ValueControllerController발견되지 않은 것입니다.

경로 구성이 양호한 것 같습니다.web.config의 핸들러 섹션을 다시 확인합니다. 통합 모드의 경우 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" />

이 주제에 대한 더 많은 정보: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

여기 목록에 제 어리석은 실수를 추가할 시간입니다. 제 webapi 기본 경로를 잘못 입력했습니다.

원본:

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

고정: ("id" 주변의 곱슬곱슬한 중괄호를 관찰합니다.)

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

이것이 매우 오래된 질문이라는 것은 감사하지만 미래의 사용자들을 위해 다른 답변을 추가할 것이라고 생각했습니다.

CI/Staging에 배포된 후에야 작업하던 프로젝트에서 바로 이 작업이 수행되었습니다.해결책은 컴파일 debug="true" 값을 앞뒤로 전환하는 동시에 각 버전을 각 환경에 한 번 배포하는 것이었습니다. 그러면 문제가 해결됩니다.

저의 경우 API Controller에서 파생되는 것을 깜빡했습니다.

그래서 그렇게 보일 것입니다.

public class ValuesController : ApiController

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

반응형