2013-03-25 3 views
0

JSON 대신 XML을 반환하도록 웹 API 컨트롤러 내에서 작업을 구성하는 방법은 무엇입니까?웹 API 액션에서 JSON 대신 XML을 반환하는 방법?

[HttpGet] 
     public UserProfile SearchByEmail(string siteName, string email) 
     { 
      var userProfile = this._profileFinderByEmail.Find(siteName, email); 

      if (userProfile == null) 
      { 
       throw new HttpResponseException(HttpStatusCode.NotFound); 
      } 

      return userProfile; 
     } 

나는이 작업을 실행할 때, 그것은 XML이 아닌 응용 프로그램/JSON을 반환

나는 XMLELEMENT 속성을 가지고있는 사용자 프로필 개체를 반환하는 작업을해야합니다. 어떻게하면 XML을 반환 할 수 있습니까? 피들러에 의해 나는 아래의 수락 헤더 키를 가지고 전송 된 요청 헤더를 판단

: 나는 XML을 반환하기를 기대하지만, 그렇지 않은

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

.

문제를 해결하는 방법은 무엇입니까? ,

Status Code:406 Not Acceptable 
+0

컨트롤러를 'ApiController'에 연결 했습니까? – Sandy

+0

예 내 컨트롤러가 ApiController에서 상속됩니다. 덕분에 –

답변

1
헤더가 제대로 표시

: 나는 아래의 오류를 볼 수 있습니다, 크롬/네트워크 탭에서보기

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

:

나는 또한 WebApiConfig 클래스에서 아래의 값을 설정 한 먼저 포맷터가 있는지 확인해야합니다. 당신은 조각을 다음과 같이 출력 등록 된 모든 포맷터 (당신은 내부 액션의 방법을 사용할 수 있습니다) 할 수 있습니다

foreach (var formatter in GlobalConfiguration.Configuration.Formatters) 
{ 
    System.Diagnostics.Debug.WriteLine(String.Format("{0}: {1}", formatter.GetType().Name, String.Join(", ", formatter.SupportedMediaTypes.Select(x=>x.MediaType)))); 
} 

결과는 출력에 표시됩니다 비주얼 스튜디오 (에서 표시 출력을 설정 ~ 디버그). 이 같은 라인을 찾아야한다 :

XmlMediaTypeFormatter: application/xml, text/xml 

를 그 다음은 어떻게 든 제거 된 것을 의미하고 응용 프로그램 코드의 일부를 찾을 필요가없는 경우. 그것이 있다면 아마도 DataContractSerializer이 엔티티를 직렬화 할 수 없음을 의미합니다 (지원되는 유형 here에 대해 자세히 읽을 수 있음).

또한 엔터티에 XmlElement 속성을 사용하고 있다고 언급했습니다. 기본적으로 XmlMediaTypeFormatter은 (위에서 언급 한 것처럼) DataContractSerializer을 사용하며 이러한 속성을 무시합니다. 당신은 당신이 (당신의 Global.asax 예를 들면) 코드를 사용할 수 있습니다 XmlSerializer로 전환하려면 : 물론 XmlSerializer

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

당신이 알아야 할 제한의 그것의 자신의 세트가있다.

+0

. XmlMediaTypeFormatter : application/xml, text/xml 및 JSON이 존재하지 않는 것을 보았습니다. 또한 디버거가 global.ascx 파일에서 손상되지 않는 것이 이상합니다. –

+0

상태 코드 : 406 사용할 수 없음 –

+1

@ Lite HTTP 오류 406 (사용할 수 없음)은 적합한 형식 기가 발견되지 않았 음을 나타냅니다 (그러한 수락 헤더 나 형식기에 대한 형식 기가 엔티티의 형식을 지정할 수 없음). [여기] (http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation)을 더 읽을 수 있습니다. – tpeczek

관련 문제