404를 반환하기 위해 MVC 작업을 얻는 방법


142

일부 데이터를 검색하는 데 사용되는 문자열을 취하는 작업이 있습니다. 이 문자열로 인해 데이터가 반환되지 않으면 (아마 삭제 되었기 때문에) 404를 반환하고 오류 페이지를 표시하고 싶습니다.

나는 현재 항목을 찾을 수 없다는이 작업에 대한 친절한 오류 메시지를 표시하는 특수보기를 반환합니다. 이것은 잘 작동하지만 이상적으로는 404 상태 코드를 반환하여 검색 엔진이이 콘텐츠가 더 이상 존재하지 않음을 알고 검색 결과에서 제거 할 수 있도록하는 것이 이상적입니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

Response.StatusCode = 404를 설정하는 것만 큼 간단합니까?


또한 Response.TrySkipIisCustomErrors = true를 유지해야합니다. @ganders의 답변은 생명의 은인이었습니다 ...
Thunder

답변:


111

여러 가지 방법이 있습니다.

  1. 당신은 일반적인 aspx 코드에 맞습니다. 지정된 방식으로 할당 할 수 있습니다
  2. throw new HttpException(404, "Some description");

1
주의해야 할 것은 404를 처리하도록 customError 페이지를 설정하면이 오류 페이지는 200을 찾을 수 없다는 것입니다 (찾을 수없는 페이지가 발견되었습니다 ... :-(). BlogController에서 예외를 던지는 경향이 있습니다. NotFound 액션이 올바른 응답 코드를 설정하도록
Nigel Sampson

20
나는 결국 : Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; 리턴 뷰 ( "MyCustomView"); 이것은 내 상황에서 완벽하게 작동합니다.
Paul Hiles

@PaulHiles : 이것은 MVC3의 대답입니다. 의견이 아니라 답변으로 의견을 제시 할 수 있기를 바랍니다.
Valamas

IIS를 사용하는 경우에는 작동하지 않습니다. 내 테스트 사이트에서는 제대로 작동하지만 라이브 사이트에서는 사용자 정의 오류 페이지가 시작됩니다.
Andy Brown

@AndyBrown은 IIS 및 IIS Express에서도 작동합니다. IIS 구성을 검토해야합니다 (관리자 콘솔)
Dewfy

150

ASP.NET MVC 3 이상 에서는 컨트롤러에서 HttpNotFoundResult 를 반환 할 수 있습니다 .

return new HttpNotFoundResult("optional description");

4
사용법 :return new HttpNotFoundResult("optional description");
Valamas

6
컨트롤러 내에서 돌아 오는 경우라는 편리한 방법도 있습니다 HttpNotFound(). 그래서 return HttpNotFound("optional description")대신 돌아올 수 있습니다.
Luis Perez


61

MVC 4 이상에서는 내장 HttpNotFound헬퍼 메소드를 사용할 수 있습니다 .

if (notWhatIExpected)
{
    return HttpNotFound();
}

또는

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}

26

코드 :

if (id == null)
{
  throw new HttpException(404, "Your error message");//RedirectTo NoFoundPage
}

Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>

또한 사용 가능한 모든 상태 코드가이 열거 형에 존재합니다 : HttpStatusCode.
user2173353

12

나는 이것을 사용했다 :

Response.StatusCode = 404;
return null;

감사합니다. 이것은 서버에서 비싼 예외를 던지는 것보다 낫습니다. 404가 IIS 로그에 기록되는지 궁금합니다. 이상적 일 것입니다.
fozylet 2012 년

1
그러나 asp.net 에서이 방법은 좋은 해결책이 아닙니다. 웹 페이지는 서버의 모든 관련 민감한 정보를 표시하기 때문입니다.
lzlstyle

1
한 가지 예외는 처리하는 데 밀리 초 미만이 소요됩니다. HTTP 연결을 수행하고 백업하는 데 수백 밀리 초와 비교하면 의미가 없습니다. HttpException을 던지거나 HttpNotFoundResult를 반환하고 상태 코드를 수동으로 설정하고 null을 반환하는 것은 끔찍합니다.
George

10

.NET Core로 작업하는 경우 다음을 수행 할 수 있습니다. return NotFound()


5

NerdDinner에서 예를 들어. 시도

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}

고맙지 만 Dewfy의 게시물에서 제안 번호 2와 비슷한 HttpException이 발생합니다. 컨트롤러 / 전역 404 페이지로 리디렉션하는 것뿐만 아니라 작업과 관련된 멋진 오류 페이지를 표시 할 수 있도록 조금 더 많은 제어 기능을 찾고 있습니다. 상태 코드를 설정하고 사용자 정의보기로 돌아가는 것이 내 상황에 맞는 방법 인 것처럼 보입니다.
Paul Hiles

4

위의 예제 중 어느 것도 아래 중간 줄을 추가 할 때까지 효과가 없었습니다.

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}

2
단순함이 효과 return HttpNotFound();가 없다고 진지하게 말하고 있습니까? 시스템은 몇 살입니까?
사라 코딩

1
시도 했습니까 return HttpNotFound();? MVC 4 이상에서는 잘 작동합니다. msdn.microsoft.com/ko-kr/library/… "TrySkipIisCustomErrors 속성은 응용 프로그램이 IIS 7.0에서 호스팅되는 경우에만 사용됩니다. IIS 7.0에서 클래식 모드에서 실행하는 경우 TrySkipIisCustomErrors 속성 기본값은 true입니다. 통합 모드에서 실행하는 경우 TrySkipIisCustomErrors 속성 기본값은 false입니다. "
사라 코딩

2

나는 사용한다:

Response.Status = "404 NotFound";

이것은 나를 위해 작동합니다 :-)




-1

다음 데모 코드를 시도하십시오 :

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.