0

我正在编写一个脚本,它允许我们构建整个 SharePoint 环境、添加解决方案并从头开始在特定页面上实施 Web 部件。除了最后几行将 Web 部件添加到页面(当然)之外,几乎整个脚本都可以工作。这是真正奇怪的事情。如果我在 power-shell 命令行中运行完全相同的代码,它每次都可以工作。将 Web 部件添加到页面的脚本是从一个单独的 ps1 文件调用的,该文件传递脚本运行所需的信息。这是代码:

function addWebPartToPage($siteURL, $pageURL, $webpartName, $listName, $solutionName, $destinationZone, $zoneIndex)
{

$web = Get-SPWeb $siteURL
$file = $web.GetFile($pageURL)

if($file.Exists)
{
    try
    {
        checkOutPage($file)
        $list = $web.Lists[$listName]
        $wpManager = $web.GetLimitedWebPartManager($web.Url + $pageURL,[System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared);
        $webPartListItem = $list.Items | where {$_.Title -eq $solutionName}
        $xmlReader = New-Object System.Xml.XmlTextReader($webPartListItem.File.OpenBinaryStream());
        $errorMsg = ""

        #breaks here:       
        $webPart = $wpManager.ImportWebPart($xmlReader, [ref]$errorMsg)
        $wpManager.AddWebPart($webpart,"$destinationZone",$zoneIndex)

    }
    catch
    {
        $ErrorMessage = $_.Exception.Message    
        $returnVal = 1          
    }
    finally
    {
        checkInPage($file)

        $pweb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
        $page = $pweb.GetPublishingPage($pageURL)
        approvePage $page

        #close the xml reader
        if($xmlReader -ne $null)
        {
            $xmlReader.Close()
        }

        $wpManager.Dispose()
        $web.Dispose()

        [GC]::Collect()     
        checkIfFailed $returnVal
    }
}

}

为了证明代码确实有效,我打开了一个具有管理员权限的新 PowerShell 窗口(请注意,调用脚本本身的窗口也使用管理员权限)并将上述变量设置为将传入的值。然后我复制并将我的代码块粘贴到窗口中并成功运行(WAT???)。
所以这让我自己和一位同事完全被难住了。为什么它在脚本窗口中作为代码块工作,但在我作为脚本执行时不会运行。我收到的错误是这样的:

将 webpart Poll 添加到页面 Pages/WebpartTest.aspx 时出错。错误:使用“2”参数调用“ImportWebPart”的异常:“无法显示或导入此页面上的 Web 部件或 Web 窗体控件。该类型未注册为安全类型。”

如果不是因为它通过 VS2010 和代码块而不是脚本成功运行,我会认为这是一个配置问题(配置中的 safeExecute 等)。我的脚本的所有其他功能都有效,包括添加和激活解决方案、创建网站集等。

任何帮助或输入将不胜感激。

谢谢你。

4

1 回答 1

0

好的,所以我在这里感觉有点愚蠢,因为我自己没有考虑过,但这就是原因,我希望它可以帮助遇到与我相同问题的其他人。

When adding a solution and activating said solution in Sharepoint, before you can access this solution in say adding a webpart to a page, you must first RESET IIS. So during my testing I did not add any code to reset the IIS on the application Sharepoint servers. The only reason I can think of that explains why it worked in the code block was that perhaps I had reset IIS inadvertently during my testing. I can't explain it otherwise. Stupid mistake and I have hung my head in shame, but there you go.

于 2012-11-09T17:31:41.973 回答