2012-08-30 3 views
1

데이터를 serialize 할 때 DataContractSerializer와 함께 WCF 서비스에서 사용하는 기본 XmlWriter를 구성하는 방법이 있습니까?WCF에서 사용하는 XmlWriter의 기본 설정을 구성 할 수 있습니까?

DataContractSerializer를 사용하는 WCF 서비스에서 새 줄 (\ r \ n)이 손실됩니다.

[편집 :] 혼란에 대해 사과드립니다. 상자 밖에서 WCF는 새로운 라인을 잃지 않습니다. ]

나는 XmlWriter를가 XmlWriterSettings (NewLineHandling.Entitize)를 사용하여 
에 새로운 라인을 인코딩 할 수 있어요,하지만 난 WCF 내 개체를 serialize 같은 방식으로 동작 만들고 싶어.

public string Serialize<T>(T object) 
    { 
    var serializer = new DataContractSerializer(typeof(T)); 
    using (var stringWriter = new StringWriter()) 
    { 
     var settings = new XmlWriterSettings { NewLineHandling = NewLineHandling.Entitize }; 
     using (var xmlWriter = XmlWriter.Create(stringWriter, settings)) 
     { 
      serializer.WriteObject(xmlWriter, object); 
      string xml = stringWriter.ToString(); 
      return xml; 
     } 
    } 
    } 

답변

1

다른 XmlWriter을 사용하려면 맞춤 메시지 인코더를 사용해야합니다. http://msdn.microsoft.com/en-us/library/ms751486.aspx의 샘플은 어떻게 쓸 수 있는지 보여줍니다.

그러나 WCF가 \r\n 문자를 잃어 버리는 것을 본 적이 없습니다. 적어도 내가 확인한 모든 시간에 \r&#XD;으로 올바르게 인증합니다.

public class StackOverflow_12205872 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     string Echo(string text); 
    } 
    public class Service : ITest 
    { 
     public string Echo(string text) 
     { 
      return text; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress)); 
     ITest proxy = factory.CreateChannel(); 
     string str = proxy.Echo("Hello\r\nworld"); 
     Console.WriteLine(str); 
     Console.WriteLine(str[5] == '\r' && str[6] == '\n'); 

     ((IClientChannel)proxy).Close(); 
     factory.Close(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 

을 그리고 피들러는이 요청이 전송되는 것을 보여줍니다 : 나는이 코드를 실행하면이 문자가 제대로 반환을 보여줍니다 아래

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header></s:Header><s:Body><Echo xmlns="http://tempuri.org/"><text>Hello&#xD; 
world</text></Echo></s:Body></s:Envelope> 

응답은 또한이 올바로 CR 문자가 포함되어 있습니다. 구성 (바인딩 포함)에 대한 자세한 내용을 공유 할 수 있습니까?

관련 문제