如何获取Sharepoint联机迁移API日志(使用c#)

时间:2018-10-15 13:44:21

标签: c# sharepoint migration

我们使用Sharepoint.Client版本16软件包,尝试在c#中创建一个MigrationJob,然后希望查看该迁移作业的状态和日志。我们设法在ProvisionMigrationContainers对象上使用ProvisionMigrationQueueSite方法配置容器和队列。而且我们设法上传了一些文件和清单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
  );
}

contextdataContainermetadataContainer已被正确实例化为成员,并已成功用于其他方法中。 migrationQueueencryption看起来也不错,但尚未在其他地方使用。不过,该加密密钥已用于上传和下载文件,并且在那里工作得很好。

出于完整性考虑,下面是我们尝试用来检查队列中是否有任何代码的代码:

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)下载日志,但是前提是您已经知道了文件名(找不到),所以看起来有点傻。

1 个答案:

答案 0 :(得分:1)

在代码中调用context.Site.CreateMigrationJobEncrypted时,它将返回一个Guid。日志文件的名称将为Import-TheGuidThatWasReturned-ANumberThatStartsAt1ButIncremennts.log

因此可以调用第一个日志文件。

导入-AE9525D9-3CF7-4D1A-A9E0-8AB0DF4F09B2-1.log

使用加密不应阻止您读取队列。只有以这种方式配置了队列,或者使用的是租用默认值而不是您自己的所有权,您将无法读取队列。