& ldquo; 404 не найдено & rdquo; при попытке звонить на сервер GRPC (на GKE) из веб-клиента (grpc-web)

Немного поздно в игре, но не вышеперечисленные решения указали мне в сторону чистого и простого решения .NET, а не json.net. Итак, вот оно, оказалось очень простым. Ниже приведен полный пример того, как это делается при стандартной сериализации .NET Json, в примере есть словарь как в корневом объекте, так и в дочерних объектах.

Золотая пуля - это кот, проанализируйте настройки как второй параметр для сериализатора:

DataContractJsonSerializerSettings settings =
                       new DataContractJsonSerializerSettings();
                    settings.UseSimpleDictionaryFormat = true;

Полный код ниже:

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

    namespace Kipon.dk
    {
        public class JsonTest
        {
            public const string EXAMPLE = @"{
                ""id"": ""some id"",
                ""children"": {
                ""f1"": {
                    ""name"": ""name 1"",
                    ""subs"": {
                    ""1"": { ""name"": ""first sub"" },
                    ""2"": { ""name"": ""second sub"" }
                    }
                },
                ""f2"": {
                    ""name"": ""name 2"",
                    ""subs"": {
                    ""37"": { ""name"":  ""is 37 in key""}
                    }
                }
                }
            }
            ";

            [DataContract]
            public class Root
            {
                [DataMember(Name ="id")]
                public string Id { get; set; }

                [DataMember(Name = "children")]
                public Dictionary<string,Child> Children { get; set; }
            }

            [DataContract]
            public class Child
            {
                [DataMember(Name = "name")]
                public string Name { get; set; }

                [DataMember(Name = "subs")]
                public Dictionary<int, Sub> Subs { get; set; }
            }

            [DataContract]
            public class Sub
            {
                [DataMember(Name = "name")]
                public string Name { get; set; }
            }

            public static void Test()
            {
                var array = System.Text.Encoding.UTF8.GetBytes(EXAMPLE);
                using (var mem = new System.IO.MemoryStream(array))
                {
                    mem.Seek(0, System.IO.SeekOrigin.Begin);
                    DataContractJsonSerializerSettings settings =
                       new DataContractJsonSerializerSettings();
                    settings.UseSimpleDictionaryFormat = true;

                    var ser = new DataContractJsonSerializer(typeof(Root), settings);
                    var data = (Root)ser.ReadObject(mem);
                    Console.WriteLine(data.Id);
                    foreach (var childKey in data.Children.Keys)
                    {
                        var child = data.Children[childKey];
                        Console.WriteLine(" Child: " + childKey + " " + child.Name);
                        foreach (var subKey in child.Subs.Keys)
                        {
                            var sub = child.Subs[subKey];
                            Console.WriteLine("   Sub: " + subKey + " " + sub.Name);
                        }
                    }
                }
            }
        }
    }
0
задан Diericx 1 March 2019 в 21:01
поделиться

1 ответ

Чтобы gRPC-Web работал, вам необходимо иметь конечную точку Envoy перед вашей службой gRPC. В частности, вам необходимо включить gRPC-Web-фильтр в вашей конфигурации envoy.yaml следующим образом: https://github.com/grpc/grpc-web/blob/master/net/grpc/gateway/examples/ эхо / envoy.yaml # L35-L38

0
ответ дан Stanley Cheung 1 March 2019 в 21:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: