2012-04-06 3 views
12

저는 놀라운 라이브러리 인 ServiceStack을 사용하기 시작했습니다.ServiceStack 및 스트림 반환

그러나 xml이 특정 형식이어야하는 xml 및 json을 반환해야하는 비즈니스 요구 사항이 있습니다.

<service name="service1" type="audio" .../> 

그래서 기본적으로 속성의 무리 :

예를 들어 우리는 형식의 XML을 기대하는 고객을 기존했다.

ServiceStack은 DTO 개념을 사용하고 xml 특성을 사용하는 위의 형식이 아닌 xml 요소를 반환하는 DataContractSerializer를 사용한다는 것을 알고 있습니다.

난 여전히 (수락 헤더에 응용 프로그램/XML 또는 응용 프로그램/JSON 전달) 요청을 DTO들을 사용하고 난 후, 내 자신의 XML 문자열 또는 JSON 문자열을 만든 다음 그들을 반환 할

:

string result = "....xml or json string..."; 
return new MemoryStream(Encoding.UTF8.GetBytes(result)); 

결과 문자열은 xml 문자열 또는 json 문자열 일 수 있습니다.

필자는 Content-Type을 text/html로 인식했습니다.

내가 사용하는 접근 방식을 사용하면 REST 원칙을 위반합니까? 현재 Content-Type에 문제가 있습니까 (text/html)?

이 방법을 사용하면 비즈니스 요구 사항을 해결할 수 있습니다.

편집

나는 같은 httpResult를 반환 할 수 있다는 것을 발견 :

올바른 콘텐츠 유형을 제공
return new HttpResult(
     new MemoryStream(Encoding.UTF8.GetBytes(result)), "application/xml"); 

.

이 경로를 사용하면 올바른 방법입니까, 아니면 문제가 있습니까?

답변

17

예 IHttpResult를 반환하면 정확한 페이로드, Content-Type 및 기타 HTTP 헤더를 원하는대로 제어 할 수 있습니다.

또한 스트림을 반환하는 것에 국한되지 않습니다. 즉, HttpResult를 사용하여 다른 Content-Type이있는 XML 문자열을 반환 할 수 있습니다.여기

더 ServiceStack의 반환 형식으로 무엇이 가능한지 보여 일부 링크입니다 :

당신은 또한 정적 파일을 반환 할 수 있습니다 FileInfo 사용 선택적 매개 변수를 포함하는 개체, 파일을 다운로드하라는 메시지를 표시하는 대신에 브라우저에서 볼을 시도합니다 첨부 파일로 파일을 반환 : 도움을

return new HttpResult(new FileInfo("~/static-response.xml"), asAttachment:true); 
+0

감사합니다. –

+0

스트림이 아닌 문자열을 반환하면 어떤 이점이 있습니까? –

+2

아니, 둘 다 ASP.NET의 HttpResponse OutputStream에 직접 작성됩니다. 따라서 MemoryStream을 사용하면 (메모리에 String이 이미있는 경우) 추가 오버 헤드가 추가됩니다. 출력을 스트리밍 할 때 문자열을 반환하는 것이 좋습니다 (예 : 메모리에서 전체 응답로드 방지). – mythz