我们使用Sharepoint.Client
版本16软件包,尝试在c#中创建一个MigrationJob
,然后希望查看该迁移作业的状态和日志。我们设法在ProvisionMigrationContainers
对象上使用ProvisionMigrationQueue
和Site
方法配置容器和队列。而且我们设法上传了一些文件和清单XML。这些XML在ID和结构中仍然包含一些错误,因此我们希望这项工作会失败。但是,我们仍然希望作业能够创建并输出一些消息和日志。不幸的是,消息队列似乎是空的,找不到日志了(至少我们找不到它们)。创建的迁移作业的Guid为空guid:00000000-0000-0000-0000-000000000000
根据https://docs.microsoft.com/en-us/sharepoint/dev/apis/migration-api-overview,日志应作为blob保存在清单容器中。但是,您实际上将如何找到日志文件的名称?问题在于所有内容都必须加密,并且不允许在blob存储中列出blob(尝试这样做会导致403错误)。
主要问题是:我们应该如何访问日志文件?还有一个额外的问题:假设创建迁移作业的命令是正确的,为什么我们会得到空guid?最后一个:为什么队列为空?我可以推测迁移作业永远不会被创建,这就是为什么GUID都是零的原因,但是我们应该如何知道阻止作业创建的原因呢?
以下是创建迁移作业的代码:
public ClientResult<Guid> CreateMigrationJob()
{
var encryption = new EncryptionOption
{
AES256CBCKey = encryptionProvider.Key
};
return context.Site.CreateMigrationJobEncrypted(
context.Web.Id,
dataContainer.Uri.ToString(),
metadataContainer.Uri.ToString(),
migrationQueue.Uri.ToString(),
encryption
);
}
context
,dataContainer
,metadataContainer
已被正确实例化为成员,并已成功用于其他方法中。 migrationQueue
和encryption
看起来也不错,但尚未在其他地方使用。不过,该加密密钥已用于上传和下载文件,并且在那里工作得很好。
出于完整性考虑,下面是我们尝试用来检查队列中是否有任何代码的代码:
public void GetMigrationLog()
{
while (migrationQueue.ApproximateMessageCount > 0) //debug code, this should be done async
{
Console.WriteLine(migrationQueue.GetMessage().AsString);
}
}
它什么也不输出,因为队列为空。我们希望至少会出现错误消息或创建日志的消息(包括日志文件的名称)。
PS:我们意识到应该可以使用DownloadToFileEncrypted(encryptionProvider, targetFile.ToString(), System.IO.FileMode.Create)
下载日志,但是前提是您已经知道了文件名(找不到),所以看起来有点傻。
答案 0 :(得分:1)
在代码中调用context.Site.CreateMigrationJobEncrypted时,它将返回一个Guid。日志文件的名称将为Import-TheGuidThatWasReturned-ANumberThatStartsAt1ButIncremennts.log
因此可以调用第一个日志文件。
导入-AE9525D9-3CF7-4D1A-A9E0-8AB0DF4F09B2-1.log
使用加密不应阻止您读取队列。只有以这种方式配置了队列,或者使用的是租用默认值而不是您自己的所有权,您将无法读取队列。