Я работаю над переносом старой веб-службы из .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 устарел с 2005 года и не поддерживал стандарты SOAP, представленные тогда. Вы получаете сообщение об ошибке, поскольку WCF, а не только CoreWCF, гораздо строже соблюдает требования. Вы получили бы те же ошибки, если бы попытались выполнить миграцию 19 лет назад. Код уже устарел в .NET Framework 4.0 и зависел от устаревших классов.
Ознакомьтесь с документацией Миграция ASMX-to-WCF и ASMX Interoperability. В этих документах описываются некоторые проблемы, с которыми вы можете столкнуться, и способы их решения. Клиенты службы ASMX ожидают, что она будет вести себя по-старому. Есть также несколько вопросов SO, относящихся к 2008 году: как с ними справиться ArrayOfString.





Вы можете создать собственный класс, как показано ниже (измените пространство имен в соответствии с вашими потребностями).
[CollectionDataContract(Name = "ArrayOfString", Namespace = "http://example.com/Report", ItemName = "string")]
[Serializable]
public class ArrayOfString : List<string>
{
}
Я нашел сообщение с похожей на вашу проблему и решил ее. Перенесите веб-метод ASMX в WCF, который принимает массив строк. А пока я хотел бы спросить, можете ли вы предоставить нам код для тестирования?