2

MEF 컨테이너에서 인터페이스의 구현을 가져 오는 사용자 지정 모델 바인더가 있습니다. 다음과 같이이 구현됩니다 내보내기가 존재하지 않는 경우 MEF는 petId의 수출이 있습니다 ...하지만 HTTP 상태 500 (서버 오류)를 반환 할 때HTTP 상태 코드 양식을 반환하는 방법 사용자 지정 모델 바인더

public class PetViewModelBinder : DefaultModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var petId = bindingContext.ValueProvider.GetValue("id"); 
     var container = controllerContext.HttpContext.Application[MvcApplication.PLUGINS] as CompositionContainer; 
     Lazy<IPet, IPetMetadata> pet = null; 
     try 
     { 
      pet = container.GetExport(typeof(IPet), petId); 
      var petVM = new Models.PetViewModel(pet); 
      bindingContext.ModelMetadata.Model = petVM; 

      return base.BindModel(controllerContext, bindingContext); 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
     finally 
     { 
      container.ReleaseExport(pet); 
     } 

    } 

이 화려하게 작동합니다. 오류 메시지 난독 처리 요구 사항에 따라 HTTP 상태 403 (금지됨)이 반환되어야합니다.

오류를 트래핑하고 응답 상태를 변경하고 콘텐츠를 반환하지 않거나이 상태를 처리하기 위해 동작의 경로를 변경하려면 어떻게해야합니까?

답변

4

특정 http 상태 코드를 반환하려면 컨트롤러 또는 작업 필터에서 수행해야합니다.

이 작업을 수행하는 한 가지 방법은 모델 바인더에서 null을 반환하고 컨트롤러에서 처리하는 것입니다. 그러나 이것은 약간 거칠지 만 다른 오류를 구분할 수는 없습니다.

특정 예외를 throw하고이를 (전역) 오류 처리에서 처리하는 또 다른 방법입니다.

[CustomHandleError(ExceptionType = typeof (NotAllowedException), View = "~/Views/Shared/Error.cshtml", 
    StatusCode = 403)] 
public ActionResult Index(FancyModel model) 
{ 
    return View(model); 
} 

마지막으로, 모델 바인더에서 사용자 지정 예외 유형 인 NotAllowedException를 던져 : 컨트롤러에서

public class CustomHandleErrorAttribute : HandleErrorAttribute 
{ 
    public int StatusCode { get; set; } 

    public override void OnException(ExceptionContext filterContext) 
    { 
    base.OnException(filterContext); 
    if (StatusCode > 0) 
    { 
     filterContext.HttpContext.Response.StatusCode = StatusCode; 
    } 
    } 
} 

이 속성과 행동을 장식 : 맞춤형는 handleError 액션 필터는이 작업을 수행 할 수 당신은 또한 정의 할 필요가있을 것이다.

web.config 파일에서 사용자 지정 오류를 사용하도록 설정 한 경우 개발 설정에서만 작동합니다.

+1

고마워요! 그것은 확실히 저에게 문제를 보는 다른 방법을 제공합니다. 이 프로젝트에서는 전역 오류 처리가 작동하지 않지만 사용자 지정 오류 처리기가 작동해야합니다. – psaxton