ASP.NET MVC-모든 경로 및 기본 경로 포착
내 응용 프로그램에서 404 오류를 올바르게 생성하도록 시도하면서 아래와 같이 라우팅 테이블 끝에 모든 경로를 포착했습니다.
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
그러나이 작업을 수행하려면 기본 경로를 제거해야합니다.
{controller}/action/{id}
그러나 이제 기본값이 제거되었으므로 대부분의 작업 링크가 더 이상 작동하지 않으며 다시 작동하도록하는 유일한 방법은 각 컨트롤러 / 작업에 대한 개별 경로를 추가하는 것입니다.
각 컨트롤러 / 액션에 대한 경로를 추가하는 것보다 더 간단한 방법이 있습니까?
사용자가 알 수없는 경로를 탐색하려고 할 때 모든 경로를 잡을 수 있도록 기본 경로를 만들 수 있습니까?
경로 제약 사용
귀하의 경우 기본 경로를 정의 {controller}/{action}/{id}
하고 제약 조건을 지정해야합니다. 아마도 컨트롤러 이름이나 행동과 관련이있을 것입니다. 그런 다음 캐치를 모두 하나 넣으면 잘 작동합니다.
따라서 누군가가 제약 조건에 실패한 리소스를 요청하면 포괄 경로가 요청과 일치합니다.
그래서. 먼저 경로 제약 조건을 사용하여 기본 경로를 정의한 다음 이후 모든 경로를 잡습니다.
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "Home|Settings|General|..." } // this is basically a regular expression
);
routes.MapRoute(
"NotFound",
"{*url}",
new { controller = "Error", action = "PageNotFound" }
);
//this catches all requests
routes.MapRoute(
"Error",
"{*.}",
new { controller = "PublicDisplay", action = "Error404" }
);
이 경로를 경로 테이블 끝에 추가하십시오.
아, 문제는 기본 경로가 3 개의 세그먼트 URL을 모두 포착한다는 것 입니다. 여기서 문제는 라우팅이 요청을 처리 할 사람을 결정하기 전에 실행된다는 것입니다. 따라서 세 개의 세그먼트 URL은 나중에 처리 할 컨트롤러가 없어도 기본 경로와 일치합니다.
한 가지 할 수있는 일은 컨트롤러에서 HandleMissingAction 메서드를 재정의하는 것입니다. 또한 태그를 사용하여 모든 404 문제를 포착해야합니다.
글쎄, 내가 찾은 것은 이것을 할 좋은 방법이 없다는 것입니다. 의 redirectMode
속성을로 설정 customErrors
했습니다 ResponseRewrite
.
<customErrors mode="On" defaultRedirect="~/Shared/Error" redirectMode="ResponseRewrite">
<error statusCode="404" redirect="~/Shared/PageNotFound"/>
</customErrors>
이것은 나에게 원하는 동작을 제공하지만 서식이 지정된 페이지를 표시하지 않습니다.
나에게 이것은 SEO가 진행되는 한 제대로 이루어지지 않았습니다. 그러나 내가 원하는 것을 정확히 수행하기 때문에 내가 놓친 해결책이 있다고 느낍니다. URL은 실패한 페이지에 남아 있으며 404를 표시합니다. Firebug에서 stackoverflow.com/fail을 검사하십시오.
가장 읽기 쉬운 버전으로 권장합니다. RouteConfig.cs와 'PageNotFound'작업을 포함하는 ErrorController.cs라는 컨트롤러에이 정보가 필요합니다. 이것은 뷰를 반환 할 수 있습니다. PageNotFound.cshtml을 생성하면 404에 대한 응답으로 반환됩니다.
routes.MapRoute(
name: "PageNotFound",
url: "{*url}",
defaults: new { controller = "Error", action = "PageNotFound" }
);
읽는 방법 :
name: "PageNotFound"
= 임의의 이름이 'PageNotFound'인 새 경로 템플릿 생성
url:"{*url}"
=이 템플릿을 사용하여 처리되지 않은 모든 경로를 매핑합니다.
defaults: new { controller = "Error", action = "PageNotFound" }
= 잘못된 경로가 매핑 될 작업을 정의합니다 (오류 컨트롤러의 'PageNotFound'작업 메서드). 잘못 입력 된 경로는 작업 방법에 매핑되지 않기 때문에 필요합니다.
구성 섹션에서 404 오류 문서를 구성한 다음 기본 경로를 복원하는 것이 좋습니다.
FWIW, 기본 경로 요구 사항도 지연되었다고 생각합니다.
My Solution is 2 steps.
I originally solved this problem by adding this function to my Global.asax.cs file:
protected void Application_Error(Object sender, EventArgs e)
Where I tried casting Server.GetLastError() to a HttpException, and then checked GetHttpCode. This solution is detailed here:
ASP.NET MVC Custom Error Handling Application_Error Global.asax?
This isn't the original source where I got the code. However, this only catches 404 errors which have already been routed. In my case, that ment any 2 level URL.
for instance, these URLs would display the 404 page:
www.site.com/blah
www.site.com/blah/blah
however, www.site.com/blah/blah/blah would simply say page could not be found. Adding your catch all route AFTER all of my other routes solved this:
routes.MapRoute(
"NotFound",
"{*url}",
new { controller = "Errors", action = "Http404" }
);
However, the NotFound route does not seem to route requests which have file extensions. This does work when they are captured by different routes.
If you're looking for ASP.NET Core catch all routes and searching Google for asp.net core catch all route
brings you here:
ASP.net core MVC catch all route serve static file
참고URL : https://stackoverflow.com/questions/4001081/asp-net-mvc-catch-all-route-and-default-route
'Program Tip' 카테고리의 다른 글
Boost를 사용하여 XML 파일 읽기 및 쓰기 (0) | 2020.11.04 |
---|---|
LaTeX : Sum 기호가 표시되는 방식을 조정하는 방법 (0) | 2020.11.04 |
Bash의 명령 줄 인수 (0) | 2020.11.04 |
ES6 Iterable을 배열로 변환 (0) | 2020.11.04 |
Asp.net Core에서 사용자 브라우저 이름 (user-agent)을 얻는 방법은 무엇입니까? (0) | 2020.11.04 |