Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / wcf и сериализация класса в xml, хочется подправить результат, каК? / 6 сообщений из 6, страница 1 из 1
12.01.2010, 13:19
    #36405133
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wcf и сериализация класса в xml, хочется подправить результат, каК?
Код: plaintext
1.
2.
- <response xmlns="http://schemas.datacontract.org/2004/07/SyndicationServiceLibrary1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <comment>erwer</comment> 
  </response>

вот получаю такой вывод при обращении по get запросу к своему wcf сервису.
сервис возвращает тип Response который обрамлен атрибутами:

Код: plaintext
1.
2.
3.
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082"), _
 System.Diagnostics.DebuggerStepThroughAttribute(), _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True), _
 System.Xml.Serialization.XmlRootAttribute(Namespace:="" IsNullable:=False)>

хочется получить вывод такой:
Код: plaintext
1.
2.
3.
<?xml version="1.0" encoding="UTF-8"?>
<response>
  <comment>erwer</comment> 
 </response>
...
Рейтинг: 0 / 0
12.01.2010, 13:55
    #36405227
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wcf и сериализация класса в xml, хочется подправить результат, каК?
WCF Message Inspector либо на стороне клиента AfterReceiveReply, либо на стороне сервиса BeforeSendReply.

Перезаписываем сообщение, типа так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {            
            MemoryStream memStream = new MemoryStream();
            XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateBinaryWriter(memStream);
            xdw.WriteStartElement("s:Body");
            xdw.WriteStartElement("GetDataResponse", "http://tempuri.org/");
            xdw.WriteStartElement("GetDataResult", "http://tempuri.org/");
            xdw.WriteAttributeString("Units", "ounces");
            xdw.WriteString("50");
            xdw.WriteEndElement();
            xdw.WriteEndElement();
            xdw.WriteEndElement();
            xdw.Flush();
            memStream.Position = 0;

            XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
            XmlDictionaryReader xdr = XmlDictionaryReader.CreateBinaryReader(memStream, quotas);

            Message replacedMessage = Message.CreateMessage(reply.Version, null, xdr);
            replacedMessage.Headers.CopyHeadersFrom(reply.Headers);
            replacedMessage.Properties.CopyProperties(reply.Properties);
            reply = replacedMessage;            
        }
...
Рейтинг: 0 / 0
12.01.2010, 14:06
    #36405260
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wcf и сериализация класса в xml, хочется подправить результат, каК?
Можно и существующее сообщение XLinq-ом (или любыми xml-ными средствами) почикать, думаю.
А не создавать новое.
...
Рейтинг: 0 / 0
12.01.2010, 14:14
    #36405279
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wcf и сериализация класса в xml, хочется подправить результат, каК?
bured,

а , ничем другим не управляется этот момент?

просто мне для 1 параметра comment проще строчку отдавать с нужными декорациями.
...
Рейтинг: 0 / 0
12.01.2010, 14:36
    #36405349
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wcf и сериализация класса в xml, хочется подправить результат, каК?
Вот всё что тебе нужно сделать.
По другому в голову ничего не приходит. Может где-то в настройках сериализера что-то есть.

инспектор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
using System;
using System.Xml;
using System.IO;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;


namespace client
{
public class MyInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
string action = reply.Headers.Action;
MessageVersion version = reply.Version; 
XmlDictionaryReader reader = reply.GetReaderAtBodyContents();
xml = reader.ReadOuterXml();
Message resp = Message.CreateMessage(version, action, xml); 
reply = resp;
}

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
        return null;            
}

}
}
Поведение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;


namespace client
{
    public class MyBehavior : IEndpointBehavior
    {
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            //no-op
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            MyInspector inspector = new MyInspector();
            clientRuntime.MessageInspectors.Add(inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            //no-op
        }

        public void Validate(ServiceEndpoint endpoint)
        {
            //no-op
        }
    }    

}

сам клиент
Код: plaintext
1.
2.
MyContractClient proxy = new MyContractClient("WSHttpBinding_IService");
            proxy.Endpoint.Behaviors.Add(new MyBehavior());
...
Рейтинг: 0 / 0
12.01.2010, 14:59
    #36405434
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
wcf и сериализация класса в xml, хочется подправить результат, каК?
bured,

ну я понял тебя. у тебя более широкий механизм.

я решил перейти от использования классов , просто к xmldocument . потом xmldocument загоняю в memorystream и выкидываю наружу.

спасибо
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / wcf и сериализация класса в xml, хочется подправить результат, каК? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]