WCF сохранить ответ в поток
От: binks Россия  
Дата: 02.02.24 05:33
Оценка:
Клиент сервиса создаётся через svcutil.
После ответа сообщение автоматически десериалзуется в объект. Если ответ большой, то это отъедает много оперативной памяти.
Каким образом можно отправить ответ в поток для сохранения на диск без десериализации?
Re: WCF сохранить ответ в поток
От: Sharov Россия  
Дата: 02.02.24 09:27
Оценка:
Здравствуйте, binks, Вы писали:

B>Клиент сервиса создаётся через svcutil.

B>После ответа сообщение автоматически десериалзуется в объект. Если ответ большой, то это отъедает много оперативной памяти.
B>Каким образом можно отправить ответ в поток для сохранения на диск без десериализации?

Может можно подсунуть свою реализацию?
Кодом людям нужно помогать!
Re: WCF сохранить ответ в поток
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.02.24 09:53
Оценка: 2 (1) +1
Здравствуйте, binks, Вы писали:

B>Клиент сервиса создаётся через svcutil.

B>После ответа сообщение автоматически десериалзуется в объект. Если ответ большой, то это отъедает много оперативной памяти.
B>Каким образом можно отправить ответ в поток для сохранения на диск без десериализации?

не используй WCF просто, используй обычный HTTPClient
Re[2]: WCF сохранить ответ в поток
От: binks Россия  
Дата: 02.02.24 10:17
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Может можно подсунуть свою реализацию?

Не понимаю вместо чего...

svcutil формирует такой код. Я вызываю Client.Request и получаю ответ.
public partial class Client : System.ServiceModel.ClientBase<ClientInterface>, ClientInterface
{
    public Client(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress)
    {
    }
    
    public ResponseMessageType Request(RequestMessageType message)
    {
        return base.Channel.Request(message);
    }
    
    public System.Threading.Tasks.Task<ResponseMessageType> RequestAsync(RequestMessageType message)
    {
        return base.Channel.RequestAsync(message);
    }
}


Или проще вообще не заморачиваться этим ServiceModel и сделать всё через HttpClient....
Re: WCF сохранить ответ в поток
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.02.24 11:21
Оценка: 1 (1)
Здравствуйте, binks, Вы писали:

https://stackoverflow.com/questions/28506525/get-http-request-body-from-basichttpbinding-of-wcf-proxy

https://learn.microsoft.com/ru-ru/dotnet/framework/wcf/extending/how-to-inspect-or-modify-messages-on-the-client
и солнце б утром не вставало, когда бы не было меня
Отредактировано 02.02.2024 11:30 Serginio1 . Предыдущая версия .
Re[3]: WCF сохранить ответ в поток
От: Sharov Россия  
Дата: 02.02.24 21:06
Оценка:
Здравствуйте, binks, Вы писали:

B>Или проще вообще не заморачиваться этим ServiceModel и сделать всё через HttpClient....


Тут я не советчик. Просто wcf везде и всюду конфигурируемый и кастомизируемый, можно делать свои
обработчики много для чего.
Кодом людям нужно помогать!
Re[2]: WCF сохранить ответ в поток
От: binks Россия  
Дата: 03.02.24 04:15
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, binks, Вы писали:


S>https://stackoverflow.com/questions/28506525/get-http-request-body-from-basichttpbinding-of-wcf-proxy

Это только на стороне сервера.

S>https://learn.microsoft.com/ru-ru/dotnet/framework/wcf/extending/how-to-inspect-or-modify-messages-on-the-client

Я уже реализую у себя IClientMessageInspector.BeforeSendRequest для добавления HTTP заголовка перед отправкой запроса на сервер. Второй метод IClientMessageInspector.AfterReceiveRequest хоть ещё и не десериализует payload, но этот момент он уже забуферизировал ответ в памяти.
Re: WCF сохранить ответ в поток
От: Qulac Россия  
Дата: 03.02.24 07:22
Оценка:
Здравствуйте, binks, Вы писали:

B>Клиент сервиса создаётся через svcutil.

B>После ответа сообщение автоматически десериалзуется в объект. Если ответ большой, то это отъедает много оперативной памяти.
B>Каким образом можно отправить ответ в поток для сохранения на диск без десериализации?

Я в одном проекте подобное вручную организовал через httpclient. Был объект запроса я его серелизовал в xml стандартный способом, ответ десерилзовал в другой объект. В принципе тут можно было ответ и в поток сохранить. Но это довольно трудоемкий способ, я использовал классы которые создает SvcUtil но в них пришлось внести много правок, что бы сервер принимал запрос. У меня в принципе выбора не было, были цифровые подписи, шифрование и плохая документация, для отладки требовалось что бы весь xml перед глазами был.
Программа – это мысли спрессованные в код
Re[3]: WCF сохранить ответ в поток
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.02.24 12:03
Оценка:
Здравствуйте, binks, Вы писали:

S>>https://learn.microsoft.com/ru-ru/dotnet/framework/wcf/extending/how-to-inspect-or-modify-messages-on-the-client

B>Я уже реализую у себя IClientMessageInspector.BeforeSendRequest для добавления HTTP заголовка перед отправкой запроса на сервер. Второй метод IClientMessageInspector.AfterReceiveRequest хоть ещё и не десериализует payload, но этот момент он уже забуферизировал ответ в памяти.

Ну раз такие проблемы проще посмотреть исходники и где можно вклиниться, где то через рефлексию, а где то подменить код.
А может проще и через HttpClient . Тебя же только один метод интересует.
и солнце б утром не вставало, когда бы не было меня
Re[2]: WCF сохранить ответ в поток
От: binks Россия  
Дата: 06.02.24 03:41
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>Я в одном проекте подобное вручную организовал через httpclient. Был объект запроса я его серелизовал в xml стандартный способом, ответ десерилзовал в другой объект. В принципе тут можно было ответ и в поток сохранить. Но это довольно трудоемкий способ, я использовал классы которые создает SvcUtil но в них пришлось внести много правок, что бы сервер принимал запрос. У меня в принципе выбора не было, были цифровые подписи, шифрование и плохая документация, для отладки требовалось что бы весь xml перед глазами был.


В итоге и сделал через HttpClient с асинхронщиной.
Я тоже использую классы, созданные через SvcUtil, как для формирования payload для SOAP, так и для десериализации. Но ответ я уже читаю с диска через XmlReader и десериализирую только нужное, что позволяет существенно экономить на памяти.
Но всё это выливается в правку того, что нагенерировал svcutil и потребует новых правок при корректировке xsd на стороне сервиса.
Re[3]: WCF сохранить ответ в поток
От: m2user  
Дата: 06.02.24 03:46
Оценка:
Сервис чей-то сторонний, т.е. его не поправить?
По-хорошему такая проблема должна решатся через постраничную передачу данных.
Re[4]: WCF сохранить ответ в поток
От: binks Россия  
Дата: 06.02.24 04:23
Оценка:
Здравствуйте, m2user, Вы писали:

M>Сервис чей-то сторонний, т.е. его не поправить?

M>По-хорошему такая проблема должна решатся через постраничную передачу данных.
Таких сервисов несколько, кто-то поддерживает постраничную в передачу, кто-то не поддерживает. Вопрос по поводу реализации этой возможности я задал, но сомневаюсь, что это будет сделано.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.