我在通过 LDAP 检索我具有 DistinguishedName 的某些组的信息时遇到问题。\n该问题似乎与它们具有特殊字符有关。
\n\n这里有两个例子,一个有效,一个无效:
\nAll in Test Group
\nAll in 463\\"567y\\\\22\\"\xc2\xa4&/2#%&! 测试组
及其 DN:
\nCN=测试组中的所有内容、OU=Groups、DC=some、DC=test、DC=com
\nCN=463\\"567y\\\\22\\"\xc2 中的所有内容\xa4&/2#%&! 测试组、OU=组、DC=某些、DC=测试、DC=com
我知道 dn\ 是正确的,因为我从用户的 ManagedObjects 属性中检索它们,并已在 AD 中验证它们并使用 ADSI 编辑。
\n\n现在,看看我使用什么代码来检索信息,请注意,此代码在没有特殊字符的组上运行良好:
\n\nDim strGroupdisplayName, strGroupsAMAccountname, strGroupmail\n\n\nFunction GetGroupInfofromDN(group_str)\non error resume next\nDIM objGroup, objDNNamespace, strLDAPGroup\nstrLDAPGroup = "LDAP://" + group_str\nSet objDNNamespace = GetObject("LDAP:")\nSet objGroup = objDNNamespace.OpenDSObject(strLDAPGroup, strADUsername, strADPassword,0)\nobjGroup.GetInfo\nstrGroupdisplayName = ""\nstrGroupsAMAccountname = ""\nstrGroupmail = ""\nstrGroupdisplayName = ObjGroup.Get("displayName")\nstrGroupsAMAccountname = ObjGroup.Get("sAMAccountname")\nstrGroupmail = ObjGroup.Get("mail")\nset objGroup = Nothing\nEnd Function\nRun Code Online (Sandbox Code Playgroud)\n\n至于我尝试过的...我尝试将组编码为 URI 格式,我尝试用转义的等效字符替换特殊字符:
\n\nstrTemp …Run Code Online (Sandbox Code Playgroud) 我故意尝试使用Newtonsoft Json创建无效的JSON,以便放置ESI包含标签,该标签将获取另外两个JSON节点。
这是我的JsonConverter的WriteJson方法:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
mApiResponseClass objectFromApi = (mApiResponseClass)value;
foreach (var obj in objectFromApi.GetType().GetProperties())
{
if (obj.Name == "EsiObj")
{
writer.WriteRawValue(objectFromApi.EsiObj);
}
else
{
writer.WritePropertyName(obj.Name);
serializer.Serialize(writer, obj.GetValue(value, null));
}
}
}
Run Code Online (Sandbox Code Playgroud)
mApiResponseClass中的EsiObj只是一个字符串,但是需要将其写入JSON响应中,以便在不使用任何属性名的情况下进行解释-这样HSI ESI才能起作用。
当然,这会导致Json Writer发生异常,其值为:
Newtonsoft.Json.JsonWriterException:'状态对象中的令牌未定义将导致无效的JSON对象。路径“。”
有没有办法解决?
理想的输出是JSON格式,从技术上讲是无效的,并且看起来像这样:
{
value:7,
string1:"woohoo",
<esi:include src="/something" />
Song:["I am a small API","all i do is run","but from who?","nobody knows"]
}
Run Code Online (Sandbox Code Playgroud)
编辑: 使用ESI,我们可以使单个响应具有不同的缓存长度-即,我们可以将可以缓存很长时间的数据放置在JSON的某些部分中,并且仅获取更新的部分,例如那些依赖客户端的部分特定的数据。ESI不是特定于HTML的。(如下所示)通过支持这些标签的Varnish运行。不幸的是,要求我们仅发出1个文件作为响应,并且不需要客户进一步的要求。我们也不能更改响应-所以我不能只添加一个专门包含其他节点的JSON节点。
编辑2: “更多json节点”部分是通过ESI解决的,它向我们的后端进一步请求用户/客户端特定的数据,即另一个端点。预期的结果是,我们随后将原始JSON文档与后来的JSON文档无缝地合并在一起。(这样,原始文档可能会很旧,而特定于客户的文档可能会很新)
编辑3: 端点/ something将输出类似JSON的片段,例如:
teapots:[ {Id: 1, WaterLevel: 100, Temperature: 74, ShortAndStout: …Run Code Online (Sandbox Code Playgroud) 我们使用 Varnish 缓存 6.2 位于 WebAPI 后端前面。后端会根据某些请求发送回缓存控制标头,以便我们可以缓存更长时间。
但是,如果后端出现故障并保持故障状态,我们会发送一个小时的 stale-while-revalidate。
因此,来自我们后端的典型缓存控制响应标头如下所示:
public, max-age=30, stale-while-revalidate=3600
Run Code Online (Sandbox Code Playgroud)
在我们的 Varnish VCL 中,我们添加了一个例程,可以在出现某些错误时停止后台获取。这是为了阻止后端的错误响应进入缓存:
sub vcl_backend_response {
if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504)
{
if (bereq.is_bgfetch)
{
return (abandon);
}
set beresp.ttl = 1s;
}
}
Run Code Online (Sandbox Code Playgroud)
我们面临的问题很简单——即使后端可用,Varnish 在 Max-Age 过期后也不会更新缓存中的项目。(并且响应发生了变化)我们已经看到了 Varnish 的响应“Age”标头超过 200 秒的问题,并且响应错误。我们还看到“Age”标头为 1-3 秒的情况,这表明发生了后台提取(或正常提取)。
这种情况发生的频率足以让我们注意到——但并不是每个请求都会发生。
我尝试过简单的“pass”,例如 Varnish 中的以下内容:
sub vcl_recv {
return(pass);
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎没有效果。
Varnish 设置是否还有其他问题可能导致上述情况?
编辑,根据评论,这是我们添加到与我们的请求交互的每个子中的一个小东西,以查看实际发生的情况:
sub vcl_deliver {
if (obj.uncacheable) {
set …Run Code Online (Sandbox Code Playgroud)