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/Value
404 오류가 발생했습니다.
확장자 없는 URL은 처리기 섹션에서 구성됩니다.웹 사이트에 대해 양식 및 익명 인증을 사용할 수 있습니다.
ExtensionLess URL이 '*'에 대해 구성되었습니다.
컨트롤러의 URL을 누르면 요청이 ExtensionlessUrlHandler-Integrated-4.0이 아닌 StaticHandler에 의해 처리됩니다.
아래 이미지와 같이 시스템에서 오류가 발생하는 이유를 알 수 없습니다.
저는 이 문제를 겪고 있었습니다.
는 제 편을시니다습했을 해 보았습니다.WebApiConfig.cs
여기서 많은 권장 사항을 충족하고 다른 곳에서 샘플을 코드화합니다.먹혔지만, 왜 하지 못했습니다.WebApiConfig.cs
MS 템플릿 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 덕분에 다음과 같은 수정 작업이 가능합니다.
WebApiConfig.cs
:public static void Register(HttpConfiguration config) { ... config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); }
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
그것에. 퍼팅으로.ValueController
URI에서, 당신은 라우팅 엔진이 이름이 붙은 클래스를 찾도록 하고 있었습니다.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
'programing' 카테고리의 다른 글
Firebase 프로젝트 ID의 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.06.30 |
---|---|
Excel 2010을 열 때마다 팀 탭이 제거됩니다. (0) | 2023.06.30 |
Node.js에서 Base64 인코딩을 수행하려면 어떻게 해야 합니까? (0) | 2023.06.30 |
마지막 Git add는 어떻게 취소할 수 있습니까? (0) | 2023.06.30 |
vuex를 사용하여 단방향 바인딩을 구성합니다. (0) | 2023.06.30 |