如何更新存储在 Sharepoint 加载项应用程序文件中的 url?

How to update url stored in Sharepoint add-in app file?

我使用自定义功能区操作和自定义菜单操作为 SharePoint 2013 创建了一个 High-Trust 加载项。

为此,我有一个 ASP.NET MVC 网站,控制器中的方法与作为自定义操作 url 放置的虚拟 url 相匹配。因此,在不同的 elements.xml 文件中,我使用标记 'remoteUrl' 填充了操作 urls,因此映射没有问题。

当我用 VS2013 创建一个包时,我写了我网站的 url,它位于 SP 服务器可访问的 VM 上,以及客户端 ID(我在注册我的应用程序时从 SP 获得)。当我点击 'Finish' 时,VS2013 生成一个文件 '.app' 可以导入 SP 在线商店或 SP 内部商店。

这是我的问题,如果我需要更改我的网站地址(存储在应用程序文件中,VS2013 只是将令牌 'RemoteUrl' 替换为我给它的 url ), 是否有任何干净的方法来更新应用程序文件,或者如果可能的话,直接将应用程序存储在 SP 应用程序商店(服务器本地)中?

我没有发现这个问题。我看到 few things 关于使用事件和网络服务更新应用程序,但我不明白。

[编辑]:我不明白我每次需要更新应用程序版本时都必须更改它,这就是它不起作用的原因。此外,似乎没有其他方法可以更新应用程序文件中的 url,而不是修改应用程序文件(zip)中的 AppManifest.xml。

在我的一个项目中,我们曾经使用以下 PowerShell 脚本来完成它。它提取了应用程序文件(它只是一个 ZIP)并修改了清单中的多个节点 XML。 对于打包,它使用 7zip 的本地副本。

function ModifyAppPackage($appPackagePath, $applicationUrl, $clientId){
[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem");

$item = get-item $appPackagePath;    
$zipFilePath = Join-Path $item.Directory.FullName $($item.BaseName + ".zip");

Copy-Item $item $zipFilePath;

$unzipDirectory = Join-Path $PSScriptRoot "\Temp";
New-Item -ItemType Directory -Force -Path $unzipDirectory;

if (Test-Path -Path $unzipDirectory\*)
{
    Remove-Item $unzipDirectory\* -Force -Confirm:$false -Recurse:$true;
}

[System.IO.Compression.ZipFile]::ExtractToDirectory($zipFilePath, $unzipDirectory);

$modifiedFile = Join-Path $unzipDirectory "modified.txt"
if (Test-Path -Path $modifiedFile)
{
    $modifiedContent = Get-Content $modifiedFile
    if ($modifiedContent -eq $applicationUrl)
    {
        Remove-Item $unzipDirectory -Confirm:$false -Recurse:$true;
        Remove-Item $zipFilePath;
        return;
    }
    Remove-Item $modifiedFile;
}
$modifiedFileContent = $applicationUrl;
$modifiedFileContent >> $modifiedFile;


$manifestFileName = "AppManifest.xml";
$manifestFilePath = Join-Path $unzipDirectory $manifestFileName;
$manifestXml = [xml](get-content $manifestFilePath);

$nameSpaceManager = New-Object System.Xml.XmlNamespaceManager($manifestXml.NameTable);
$nameSpaceManager.AddNamespace("ns", $manifestXml.DocumentElement.NamespaceURI);

$startPageElement = $manifestXml.SelectSingleNode("/ns:App/ns:Properties/ns:StartPage", $nameSpaceManager);
$StartPage = $applicationUrl + "?{StandardTokens}"
$startPageElement.'#text' = $StartPage


$InstalledEventEndpointElement = $manifestXml.SelectSingleNode("/ns:App/ns:Properties/ns:InstalledEventEndpoint", $nameSpaceManager);
$InstalledEventEndpoint = $applicationUrl + "/Services/AppEventReceiver.svc"
$InstalledEventEndpointElement.'#text' = $InstalledEventEndpoint

$clientIdElement = $manifestXml.SelectSingleNode("/ns:App/ns:AppPrincipal/ns:RemoteWebApplication", $nameSpaceManager);
$clientIdElement.ClientId = $clientId;  

$manifestXml.Save($manifestFilePath);

if (Test-Path -Path $zipFilePath)
{
    Remove-Item $zipFilePath;
}

$pathToZipExe = $("$PSScriptRootza.exe");
[Array]$arguments = "a", "-tzip", "$zipFilePath", "$unzipDirectory\*.*", "-r";
& $pathToZipExe $arguments;

# Cleanup
Remove-Item $unzipDirectory -Confirm:$false -Recurse:$true;
Remove-Item $appPackagePath -Confirm:$false;

# Rename new zip to .app
Rename-Item $zipFilePath $appPackagePath -Force -Confirm:$false;

return $true;

}

我认为可以将 url 存储在应用程序的自定义列表之一中。请参阅列表中的 url。每当您需要更改 url 时,都可以从应用程序本身完成。