2011-02-16 3 views
3

나는 한 조각에 매우 많은 양의 데이터를 뱉어내는 webservice를 사용하고 있습니다. 응답 문자열은 8MB와 같을 수 있습니다. 데스크톱 PC에서는 문제가되지 않지만 내장 된 장치는 8MB 문자열 객체를 처리합니다.SoapHttpClientProtocol : 응답을 문자열 대신 스트림으로 받으시겠습니까?

응답을 스트림으로 가져 오는 방법이 있는지 궁금합니다. 현재 아래와 같은 방법을 사용하고 있습니다. 대신 POST 요청을 사용해 보았습니다. 그러나 SOAP은 더 편리합니다 (응답은 XML이고 POST를 사용하면 일반 텍스트 응답을 유효한 XML로 다시 변환해야 함). 문자열이 아닌 스트림을 반환하는 다른 종류의 "호출"을 사용할 수 있습니까? 어떤 아이디어?

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("MyAPI/MyMethod", RequestNamespace="MyAPI", ResponseNamespace="MyAPI", ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped, Use=System.Web.Services.Description.SoapBindingUse.Literal)] 
    public string MyMethod(string sID) 
    { 
     object[] results = this.Invoke("MyMethod", new object[] { sID }); 
     return ((string)(results[0])); 
    } 

답변

1

이전 ASMX 웹 서비스 클라이언트 인프라를 사용하는 경우 한계가 있습니다. 한 가지 제한점은 역 직렬화 된 데이터를 제외하고 응답을 얻는 간단한 방법이 없다는 것입니다.

부분 클래스를 사용하여 GetWebResponse 메서드를 재정 의하여 사용자 지정 WebResponse을 반환 할 수 있습니다. 그러면 후자는 GetResponseStream 메서드를 재정 의하여 기본 버전을 호출하고 스트림을 소비 한 다음 "비어있는"웹 요청이 포함 된 스트림을 반환합니다. 그렇지 않으면 .NET이 내용이없는 스트림에서 질식합니다.

GetReaderForMessage 메서드를 재정 의하여 비슷한 방법을 시도해 볼 수도 있습니다. 이 인스턴스에는 Stream 속성을 사용할 수있는 SoapClientMessage 인스턴스가 전달됩니다. 다시 말하지만, 스트림을 웹 서비스 인프라가 소비 할 수있는 것으로 설정해야합니다.

이렇게하는 더 좋은 방법은 WCF 클라이언트를 사용하는 것입니다. WCF는 훨씬 강력하고 사용하기 쉬운 확장 성 메커니즘을 가지고 있습니다.

실제로 WCF 클라이언트를 확장 할 필요조차 없습니다. 이 버퍼링 문제가 전혀 발생하지 않도록 구성 할 수 있습니다.

+0

내가 대신 ASMX의 WCF를 사용하여 내 Webservice를 연결하는 경우, 그것은 나에게 도움이 될 것입니다?아니면 WCF로 래핑 된 SAOP 응답을 받고 동일한 문제가 있습니까? – Krumelur

+0

WCF는 아무 것도 "포장하지 않습니다". WCF는 단순히 ASMX 웹 서비스 및 클라이언트를 대체합니다. 그것이 훨씬 더 많이 융통성이 있기 때문에 도움이 될 것입니다. 무엇보다도 ASMX를 구성 할 방법이 없었지만 올바른 작업을 수행하도록 구성 할 수 있습니다. –

1

모든 웹 서비스 호출이 SOAP을 반환 할 것입니다. 스트림이 비누 패킷으로 직렬화되어 서비스에서 반환 될 수 있다고 생각하지 않습니다. 그리고 가능한 경우에도 직렬화 된 스트림은 최소한 문자열 자체만큼 커지지 않습니까?

1

나는 대답이 '아니오'라고 믿는다. SOAP을위한 스트림 개념이 없다.

은 아마도 가장 간단한 대답은 당신의 방법을하는 것입니다 : 모바일 장치가

  • 캐시를 처리 할 수 ​​

    • 이 세그먼트로 당신의 응답을 분석 이러한 세그먼트
    • 수익의 사전으로 응용 프로그램 변수에 응답 GUID의 arraylist.

    그런 다음 원래의 응답을 재 조립시 모든 웹 서비스 리턴을 처리, 별도로 GUID를 통해이 세그먼트의 각 클라이언트 요청을 할 수 있습니다.

  • 관련 문제