Один из лучших вариантов для достижения вашей цели - использование правил брандмауэра, поскольку вы не можете ограничивать IP-адреса через глобальный LB или сам GCP L7 LB. Однако, если вы используете Ingress в своем кластере Kubernetes , вы можете ограничить доступ к вашему приложению на основе выделенных IP-адресов.
Одним из возможных вариантов использования может быть то, что у вас есть настройка разработки и вы не хотите, чтобы все модные новые функции были доступны всем, особенно конкурентам. В таких случаях могут использоваться белые списки IP для ограничения доступа.
Это можно сделать, указав допустимые диапазоны IP-адресов клиентов через аннотацию ingress.kubernetes.io/whitelist-source-range
.
Значение представляет собой разделенный запятыми список блока CIDR.
Например:
10.0.0.0/24, 1.1.1.1/32.
Пожалуйста, получите больше информации здесь .
Ваш первый импульс был почти корректен.:) Согласно David B, если Вы не говорите LINQ точно, как Вы определяете равенство и затем даете ему набор XElements, оно сравнит их ссылкой. К счастью, можно сказать этому использовать различные критерии путем определения IEqualityComparer "XElement" (в основном, объект, который имеет, Равняется методу, который возвращает истинную эквивалентность, два XElements равны согласно определению и лжи иначе и методу GetHashCode, который берет XElement и возвращает хэш-код на основе критериев равенства).
Например:
var elements = xDocument.Descendants(w + "sdt")
.Union(otherDocument.Descendants(w + "sdt", new XElementComparer())
.RestOfYourCode
...
Где-то в другом месте в Вашем проекте
public class XElementComparer : IEqualityComparer‹XElement› {
public bool Equals(XElement x, XElement y) {
return ‹X and Y are equal according to your standards›;
}
public int GetHashCode(XElement obj) {
return ‹hash code based on whatever parameters you used to determine
Equals. For example, if you determine equality based on the ID
attribute, return the hash code of the ID attribute.›;
}
}
Примечание: У меня нет платформы дома, таким образом, точный код не тестируется, и код IEqualityComparer отсюда (прокрутите вниз к второму сообщению).
Действительно трудно диагностировать Ваше "левое соединение" наблюдение, не видя то, что это - Вы, используют, чтобы прийти к тому заключению. Вот мой выстрел в темноте.
XDocument doc1 = XDocument.Parse(@"<XML><A/><C/></XML>");
XDocument doc2 = XDocument.Parse(@"<XML><B/><C/></XML>");
//
var query1 = doc1.Descendants().Union(doc2.Descendants());
Console.WriteLine(query1.Count());
foreach (XElement e in query1) Console.WriteLine("--{0}",e.Name);
6
--XML
--A
--C
--XML
--B
--C
//
var query2 = doc1.Descendants().Concat(doc2.Descendants())
.GroupBy(x => x.Name)
.Select(g => g.First());
Console.WriteLine(query2.Count());
foreach (XElement e in query2) Console.WriteLine("--{0}", e.Name);
4
--XML
--A
--C
--B
В linq к объектам (который является тем, что linq к xml действительно), Объединение против использования ссылочных типов ссылочное равенство для тестирования на дубликаты. XElement является ссылочным типом.
Я смог заставить следующее работать, но это довольно ужасно:
var elements = xDocument.Descendants(w + "sdt")
.Concat(otherDocument.Descendants(w + "sdt")
.Where(e => !xDocument.Descendants(w + "sdt")
.Any(x => x.Element(w + "sdtPr")
.Element(w + "tag")
.Attribute(w + "val").Value ==
e.Element(w + "sdtPr")
.Element(w + "tag")
.Attribute(w + "val").Value)))
.Select(sdt =>
new XElement(
sdt.Element(w + "sdtPr")
.Element(w + "tag")
.Attribute(w + "val").Value,
GetTextFromContentControl(sdt).Trim())
)
);
Конечно, должен быть лучший путь.
Что относительно чего-то вроде этого?
var xDoc = from f in xDocument.Descendants(w + "sdt")
select new {xNode = f, MatchOn = f.Element(w + "sdtPr").Element(w + "tag").Attribute(w + "val").Value };
var oDoc = from o in otherDocument.Descendants(w + "sdt")
select new {MatchOn = o.Element(w + "sdtPr").Element(w + "tag").Attribute(w + "val").Value };
var elements = from x in xDoc.Where(f => !oDoc.Any(o => o.MatchOn == f.MatchOn))
select new XElement(x.MatchOn, GetTextFromContentControl(x.xNode).Trim());