有人在单个kmip请求中使用了定位和获取操作。由于难以同时进行操作,因此出现错误。 如您所见,我正在向服务器发送kmip请求。
<RequestMessage>
<RequestHeader>
<ProtocolVersion>
<ProtocolVersionMajor type="Integer" value="1"/>
<ProtocolVersionMinor type="Integer" value="2"/>
</ProtocolVersion>
<Authentication>
<Credential>
<CredentialType type="Enumeration" value="UsernameAndPassword"/>
<CredentialValue>
<Username type="TextString" value="vijans"/>
<Password type="TextString" value="asdf1234"/>
</CredentialValue>
</Credential>
</Authentication>
<BatchOrderOption type="Boolean" value="1"/>
<BatchCount type="Integer" value="2"/>
</RequestHeader>
<BatchItem>
<Operation type="Enumeration" value="Locate"/>
<UniqueBatchItemID type="ByteString" value="31303030303031"/>
<RequestPayload>
<Attribute>
<AttributeName type="TextString" value="Name"/>
<AttributeValue>
<NameValue type="TextString" value="new_ss_nv"/>
<NameType type="Enumeration" value="UninterpretedTextString"/>
</AttributeValue>
</Attribute>
</RequestPayload>
</BatchItem>
<BatchItem>
<Operation type="Enumeration" value="Get"/>
<UniqueBatchItemID type="ByteString" value="31303030303032"/>
<RequestPayload/>
</BatchItem>
</RequestMessage>
这是无效的,因为get操作不会演变为使用唯一标识符。可以帮助别人吗?
答案 0 :(得分:1)
您的KMIP服务器必须实现ID占位符机制。这是一个临时的唯一标识符变量,用于在请求中的批处理项目之间缓存标识符 (请参阅规范中的Client-to-Server Operations部分)。
您可以看到每个操作如何使用或保存此ID占位符。 Locate operation的摘录:
服务器返回找到的对象的唯一标识符的列表, 然后可以使用Get操作来检索。 [...]。如果一个 唯一的唯一标识符返回给客户端,然后服务器返回 应将此操作返回的唯一标识符复制到 ID占位符变量。如果“定位”操作匹配多个 一个对象,并且在请求中省略了“最大项目数”值,或者 设置为大于1的值,则服务器应清空ID 占位符,导致随后进行的所有批处理操作 定位,并且没有明确指定唯一标识符, 失败。
在“获取”操作中,Get Request Payload table指定不需要唯一标识符,并描述:
如果省略,则ID占位符值由服务器用作 唯一标识符。
然后进行 Locate操作,如果使用单个唯一标识符定位结果,则服务器必须将该值缓存在ID占位符中(与下一个操作无关),否则必须清空ID占位符。
最后对于 Get操作,如果请求中未定义唯一标识符,则服务器必须使用ID占位符进行操作。如果ID占位符为空,则操作必须失败,并显示类似“无效字段”的结果(我不确定该结果的原因,但这对我来说很有意义)。