Можно ли настроить параметры по умолчанию для XmlWriter, используемого WCF?

Есть ли способ настроить XmlWriter по умолчанию, используемый службой WCF с DataContractSerializer при сериализации данных?

Стандартная служба WCF, использующая DataContractSerializer, теряет новые строки (\r\n).

[Изменить: Прошу прощения за путаницу. По умолчанию WCF НЕ теряет новые строки.]

Я могу заставить XmlWriter кодировать новые строки в 
 с помощью XmlWriterSettings (NewLineHandling.Entitize), но я хочу, чтобы WCF вел себя так же при сериализации моего объекта.

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;
       }
     }
  }

person Angel    schedule 30.08.2012    source источник


Ответы (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();
    }
}

И Fiddler показывает отправку этого запроса:

    <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. Можете ли вы поделиться более подробной информацией о вашей конфигурации (включая привязку)?

person carlosfigueira    schedule 30.08.2012