Выход из амперсандов (&) на сгенерированные запросы из класса WCF - PullRequest
1 голос
/ 16 мая 2019

У меня проблемы со строками, содержащими амперсанды в моем клиенте, сгенерированными из dotnet-svcutil.

Когда я получаю ответ через клиента, все амперсанды сериализуются как

<Users xsi:type=\"xsd:string\">John &amp; Jane</Users>

Когдая извлекаю значение из запроса в моем коде, он был десериализован как амперсанд

UserResponse users  = await GetUsersAsync()

users.Names = "John & Jane"

На более позднем этапе мне нужно отправить значение пользователей обратно, как это

await SetUsersAsync(users.Names);

Когда я перехватываю сгенерированный запрос мыла, я вижу, что амперсанд не экранирован

public class MyMessageInspector : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            var xml = reply.ToString(); // This shows <Users xsi:type=\"xsd:string\">John &amp; Jane</Users>
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            var xml = request.ToString(); // This shows <Users xsi:type=\"xsd:string\">John & Jane</Users>

            return null;
        }
    }

Это вызывает сбой всего запроса в подключенной службе.Из информации, которую я нашел в сети, амперсанд должен быть преобразован в &amp; с помощью сериализатора.Я мог бы преобразовать значение самостоятельно, но так как я только возвращаю значение, полученное от мыльного клиента, мне пришлось бы проверять и преобразовывать каждую возвращаемую строку.

Есть ли у вас какие-либо предложения поКак я могу настроить сгенерированный клиент для автоматического экранирования амперсандов?

1 Ответ

0 голосов
/ 16 мая 2019

Для ядра .net 2.1 +:
Используйте метод HtmlEncode для HttpUtility, доступный в System.Web, для кодирования строк, отправляемых клиенту.

using System.Web;

await SetUsersAsync(HttpUtility.HtmlEncode(users.Names));

Для .netCore 2.0 (или .net 1. * с установкой пакета):

использовать HtmlEncoder.Default.Encode(users.Names)

, который доступен в System.Text.Encodings.Web

...