如何更新存储在Sharepoint插件应用程序文件的url

本文关键字:插件 Sharepoint 应用程序 文件 url 存储 何更新 更新 | 更新日期: 2023-09-27 18:11:08

我为SharePoint 2013创建了一个具有自定义功能区操作和自定义菜单操作的高信任插件。

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

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

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

我没有找到解决这个问题的方法。我看到一些关于用事件和web服务更新应用程序的事情,但我不明白。

[编辑]:我不明白,我必须改变应用程序的版本,每次我需要更新它,这就是为什么它没有工作。此外,似乎没有其他的方法来更新url在应用程序文件比修改AppManifest.xml在应用程序文件(这是一个zip)。

如何更新存储在Sharepoint插件应用程序文件的url

在我的一个项目中,我们曾经使用下面的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 = $("$PSScriptRoot'7za.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时,它可以从应用程序本身完成。