Проблема сериализации при передаче массива в службе CoreWCF

Я работаю над переносом старой веб-службы из .NET (.asmx) в службу SOAP CoreWCF. Цель состоит в том, чтобы перейти с .NET Framework 4.0 на .NET 6/8, не затрагивая никакие зависимости вышестоящего уровня.

В основном миграция прошла успешно, но есть один вариант использования, который оказался неудачным. У старого WebService есть API, который принимает на вход массив строк. Однако когда я реализовал те же параметры в CoreWCF, входящий массив всегда воспринимался как пустой.

Ключевое отличие, которое я заметил, заключается в экспортированном WSDL. Служба CoreWCF указывает пространство имен для элемента массива как «http://schemas.microsoft.com/2003/10/Serialization/Arrays», тогда как более старая версия WebService не имела какого-либо конкретного пространства имен для этого элемента массива.

Мое основное подозрение заключается в том, что CoreWCF не может десериализовать массив из-за добавленных мною инспекторов сообщений. Я вижу, что эти инспекторы извлекают значения до того, как они будут переданы в операцию. Я также попытался изменить запрос перед отправкой его в операцию, но этот подход не является ни элегантным, ни эффективным.

Буду очень признателен за любые рекомендации по решению этой проблемы.

Я нашел сообщение с похожей на вашу проблему и решил ее. Перенесите веб-метод ASMX в WCF, который принимает массив строк. А пока я хотел бы спросить, можете ли вы предоставить нам код для тестирования?

QI You 02.04.2024 08:23

Спасибо, это ответ на мой вопрос, именно то, что я искал.

Akshay Pradeep-Kulkarni 02.04.2024 13:22

ASMX устарел с 2005 года и не поддерживал стандарты SOAP, представленные тогда. Вы получаете сообщение об ошибке, поскольку WCF, а не только CoreWCF, гораздо строже соблюдает требования. Вы получили бы те же ошибки, если бы попытались выполнить миграцию 19 лет назад. Код уже устарел в .NET Framework 4.0 и зависел от устаревших классов.

Panagiotis Kanavos 02.04.2024 14:29

Ознакомьтесь с документацией Миграция ASMX-to-WCF и ASMX Interoperability. В этих документах описываются некоторые проблемы, с которыми вы можете столкнуться, и способы их решения. Клиенты службы ASMX ожидают, что она будет вести себя по-старому. Есть также несколько вопросов SO, относящихся к 2008 году: как с ними справиться ArrayOfString.

Panagiotis Kanavos 02.04.2024 15:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать собственный класс, как показано ниже (измените пространство имен в соответствии с вашими потребностями).

[CollectionDataContract(Name = "ArrayOfString", Namespace = "http://example.com/Report", ItemName = "string")]
   [Serializable]
   public class ArrayOfString : List<string>
   {
   }

Другие вопросы по теме