2012-04-10 2 views
0

WCF 서비스가있는 ASP.NET MVC3 솔루션이 있습니다. 이 WCF 서비스에서 회사 목록 (2200 개가 넘는 레코드)을 얻을 때 오류가 발생했습니다. 들어오는 메시지의 최대 메시지 크기 할당량이을 초과했습니다.들어오는 메시지의 최대 메시지 크기 할당량을 초과했습니다. >> 900000로 설정하십시오.

이유는 Web.Config 파일에 경우 : maxBufferPoolSize 및 maxReceivedMessageSize 내가 900000으로 변경 65536이었고, 지금은 어떤 문제가 발생하지 않습니다.

내 질문 : maxBufferPoolSize 및 maxReceivedMessageSize에 대해 900000 (900k)의 값을 갖는 것이 여전히 합리적입니까? 내 모든 레코드에 데이터를 매기는 것이 정말로 필요합니다.

하위 질문 : WCF 서비스에서 직접 '페이지 매기기'를 수행하고 필요한 데이터 페이지 만 반환하는 것이 더 효율적입니까? 그만한 가치가 있나요?

도움 주셔서 감사합니다.

+0

당신은 확실히 WCF 측의 페이지 매김을 구현할 수있는이보십시오. 나는 이것이 당신이 접근 할 수있는 코드라고 생각합니까? – Maess

+2

나는이 기사가 당신과 매우 관련이있을 것이라고 생각한다 : http://www.codinghorror.com/blog/2012/03/the-end-of-pagination.html. 2200 개의 레코드를 실제로 표시해야합니까? 서비스를 호출하기 전에 필터링을 허용했다면 사용자에게 더 좋지 않겠습니까? – mafue

+0

@Maess : 예 WCF 서비스의 소스 코드에 액세스 할 수 있습니다. – Bronzato

답변

1

900k 메시지 크기가 비합리적인 것은 아닙니다. 나는 그것이 당신에게 예를 들어 확장을위한 공간을 제공하는지 확인하기 위해 몇 가지 점검을하는 것이 좋습니다. 4000 레코드가있을 때 여전히 적합할까요? 나는 2MB에 대한 다른 제안을 한도로 보았으므로 그 범위 안에들 수 있습니다.

대안, 귀하의 의견에 따라 두 가지 방법을 제공하는 것입니다 :

GetAllRecords() 
returns all 

GetSomeRecords(int limit) 
returns a subset, plus a count of the total available. 

클라이언트 응용 프로그램은 사용자의 기본 설정에 따라, 호출하는 방법을 선택할 수 있습니다. 사용자가 페이지를보고 싶다면 GetAllRecords를 호출하고 클라이언트 응용 프로그램 내에서 페이지 매김을하십시오.

1

MaxReceivedMessageSize는 DoS 공격을 피하기 위해 작게 유지해야합니다. 서비스가 인트라넷 시나리오에있는 경우 기본값보다 커야합니다. 공개 인트라넷에있는 경우 공격의 영향과 페이징 요구의 유용성 영향을 비교 검토해야합니다.

maxbufferPool 크기는 예상되는 동시 요청 수에 따라 달라지기 때문에 대답하기가 더 어렵습니다. 설명

http://social.msdn.microsoft.com/Forums/en/wcf/thread/d6e234d3-942f-4e9d-8470-32618d3f3212/

+1

+1 좋은 조언입니다. 메시지 크기를 줄이면 다음해야합니다. 아인슈타인을 바꾸어 말하면 가능한 한 작아야하지만 더 작아서는 안됩니다. – mafue

+0

+1 아인슈타인 인용 : o) –

관련 문제