문제

문제

현재 프로젝트에서는 거의 모든 작업에 대해 다양한 HTTP 요청 헤더를 기반으로 다양한 작업을 수행해야 합니다.

현재 나는 하나의 대규모 컨트롤러(모두 동일한 리소스 유형에 대해)를 가지고 있으며 모든 작업 메서드에는 ActionName 속성(동일한 매개 변수를 사용하지만 다른 작업을 수행하는 동일한 작업의 여러 버전을 가질 수 있도록)과 사용자 정의 특정 헤더에 특정 값이 있는지 확인하는 FilterAttribute(미리보기 5의 AcceptVerbsAttribute와 거의 동일하게 구현됨).

코드를 별도의 컨트롤러에 푸시하고 RouteTable이 헤더를 기반으로 두 컨트롤러 사이를 선택하도록 하고 싶지만 이 작업을 수행하는 가장 깔끔한 방법이 생각나지 않습니다.

예를 들어 파일 목록이 있다고 가정해 보겠습니다.서비스는 다음 두 가지 방법 중 하나로 요청을 처리해야 합니다.

  1. 클라이언트는 zip 파일을 원하고 "accept:application/zip"을 헤더로 사용하여 파일 목록을 zip 파일로 압축한 다음 클라이언트에 다시 보냅니다.

  2. 클라이언트는 HTML 페이지를 원하므로 "accept:text/html"을 입력하면 사이트는 파일이 나열된 테이블 형식의 html 페이지를 다시 보냅니다.

도움이 되었습니까?

해결책

어떤 헤더가 들어오는지에 따라 행동과 행동이 약간 다른 것 같습니다.나는 가능한 한 차이점을 분리하려고 노력할 것입니다.

예를 들어 애플리케이션 논리는 동일하지만 사용자에게 응답을 렌더링하는 방법만 다른 경우 Http 헤더를 기반으로 다른 작업을 수행하는 사용자 지정 ActionResult를 작성하는 것을 고려할 수 있습니다.

그러나 논리가 완전히 다른 경우 각 경로에 연결하는 사용자 지정 라우팅 제약 조건(IRoutConstraint)을 구현할 수 있습니다.아이디어를 얻으려면 HttpMethodConstraint 구현을 살펴보세요.

다른 팁

헤더를 기반으로 별도의 컨트롤러가 필요한지 잘 모르겠습니다.이 구조는 완벽하게 합리적으로 들립니다.말씀하신 것처럼 컨트롤러가 거대하다면 여러 리소스를 처리하는지 고려해보세요. 그렇다면 리소스를 기반으로 여러 컨트롤러로 분할해야 할까요?

가능한지는 확실하지 않지만 이것이 AcceptVerbs 속성과 비슷한 것 같습니다. Preview 5에 추가됨.콘텐츠 유형에 따라 비슷한 것을 추가할 수 있는지 알아보기 위해 이것이 어떻게 구현되었는지(MVC 소스 가져오기) 살펴보겠습니다.

살펴봐야 할 것 이 게시물.http 헤더를 기반으로 하는 json 및 xml 응답 구현에 대해 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top