2009-06-01 2 views
10

[OperationContract] [WebGet] 메서드를 정의하여 HTML에 문자열을 저장하지 않고 문자열에 저장된 XML을 반환하려면 어떻게해야합니까?WCF의 [WebGet] 메서드에 대한 노출 된 XML을 내보내는 방법?

응용 프로그램은 WCF 서비스를 사용하여 문자열로 저장된 XML/XHTML 콘텐츠를 반환합니다. XML은 [DataContract]를 통해 특정 클래스에 해당하지 않습니다. XSLT에서 사용하기위한 것입니다.

[XmlRoot] 
public class XmlContent : IXmlSerializable 
{ 
    public XmlContent(string content) 
    { 
     this.Content = content; 
    } 
    public string Content { get; set; } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 

     writer.WriteRaw(this.Content); 
    } 
    #endregion 
} 

그러나 때 직렬화, 루트 태그 랩 주어진 내용이 :

[OperationContract] 
[WebGet] 
public XmlContent GetContent() 
{ 
    return new XmlContent("<p>given content</p>"); 
} 

나는이 클래스를 가지고있다.

<XmlContent> 
    <p>given content</p> 
</XmlContent> 

나는 루트 태그 ([XmlRoot (ElementName을 = "DIV")])의 이름을 변경하는 방법을 알고,하지만 난 가능하다면, 루트 태그를 생략 할 필요가있다.

IXmlSerializable 대신 [DataContract]를 시도했지만 유연성이 떨어집니다.

답변

8

XmlElement를 반환하십시오. IXmlSerializable은 필요하지 않습니다. 래퍼 클래스는 필요하지 않습니다.

예를 들어 서비스 인터페이스 :

namespace Cheeso.Samples.Webservices._2009Jun01 
{ 
    [ServiceContract(Namespace="urn:Cheeso.Samples.Webservices")] 
    public interface IWebGetService 
    { 
     [OperationContract] 
     [WebGet(
       BodyStyle = WebMessageBodyStyle.Bare, 
        RequestFormat = WebMessageFormat.Xml, 
        ResponseFormat = WebMessageFormat.Xml, 
        UriTemplate = "/Greet/{greeting}")] 
     XmlElement Greet(String greeting); 
    } 
} 

서비스 구현 :

namespace Cheeso.Samples.Webservices._2009Jun01 
{ 
    [ServiceBehavior(Name="WcfWebGetService", 
        Namespace="urn:Cheeso.Samples.WebServices", 
        IncludeExceptionDetailInFaults=true)] 

    public class WcfWebGetService : IWebGetService 
    { 
     public XmlElement Greet (String greeting) 
     { 
      string rawXml = "<p>Stuff here</p>"; 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(new System.IO.StringReader(rawXml)); 
      return doc.DocumentElement; 
     } 
    } 
} 

이이 비슷한 질문을 참조하지만, WebGet이 트위스트없이 :
serializing-generic-xml-data-across-wcf-web-service-requests.

+0

감사합니다. 그게 작동하지만 XML을 비 직렬화 한 다음 다시 직렬화하는 단점이 있습니다. 내가 원하는만큼 효율적이지는 않지만 적어도 루트 태그는 제거됩니다. 대안을 가져 주셔서 감사합니다. –

+0

그래, 원본 데이터가 문자열로 저장되어 있다면 다중 단계 프로세스를 거쳐야한다고 생각합니다. 정적 문자열 일 경우 한 번만 수행 한 다음 결과를 캐시 할 수 있습니다. 최종 문서 조각을 채우는 템플릿이라고 가정하면 템플릿을 캐시하고 각 요청에 따라 동적 비트를 채울 수 있습니다. – Cheeso

+0

이 예제를 모노 2.10.8.1 throws와 함께 사용 - 예외 유형 'System.Xml.XmlElement'에 DataContract 특성 이름을 null 또는 빈 문자열로 설정할 수 없습니다. – Tom

관련 문제