我尝试借助Webrequest,Sharepoint Online中的Button来触发。
第一个Errro代码:
异常调用" GetResponse"用" 0"参数:"远程服务器返回错误:(403)禁止。"
$solutionId = Get-SPOSolutionId -solutionName $solutionName
# Queries the solution's page
$operation = ""
if($activate)
{
$operation = "ACT"
}
else
{
$operation = "DEA"
}
$solutionPageUrl = Join-SPOParts -Separator '/' -Parts $context.Site.Url, "/_catalogs/solutions/forms/activate.aspx?Op=$operation&ID=$solutionId"
$c
if ($context.Credentials -ne $null)
{
$authCookieValue = $context.Credentials.GetAuthenticationCookie($context.Url)
# Create fed auth Cookie
$fedAuth = new-object System.Net.Cookie
$fedAuth.Name = "FedAuth"
$fedAuth.Value = $authCookieValue.TrimStart("SPOIDCRL=")
$fedAuth.Path = "/"
$fedAuth.Secure = $true
$fedAuth.HttpOnly = $true
$fedAuth.Domain = (New-Object System.Uri($context.Url)).Host
# Hookup authentication cookie to request
$cookieContainer.Add($fedAuth)
$request.CookieContainer = $cookieContainer
}
else
{
# No specific authentication required
$request.UseDefaultCredentials = $true
}
$request.ContentLength = 0
$response = $request.GetResponse()
# decode response
$strResponse = $null
$stream = $response.GetResponseStream()
if (-not([String]::IsNullOrEmpty($response.Headers["Content-Encoding"])))
{
if ($response.Headers["Content-Encoding"].ToLower().Contains("gzip"))
{
$stream = New-Object System.IO.Compression.GZipStream($stream, [System.IO.Compression.CompressionMode]::Decompress)
}
elseif ($response.Headers["Content-Encoding"].ToLower().Contains("deflate"))
{
$stream = new-Object System.IO.Compression.DeflateStream($stream, [System.IO.Compression.CompressionMode]::Decompress)
}
}
# get response string
$sr = New-Object System.IO.StreamReader($stream)
$strResponse = $sr.ReadToEnd()
$sr.Close()
$sr.Dispose()
$stream.Close()
$inputMatches = $strResponse | Select-String -AllMatches -Pattern "<input.+?\/??>" | select -Expand Matches
$inputs = @{}
# Look for inputs and add them to the dictionary for postback values
foreach ($match in $inputMatches)
{
if (-not($match[0] -imatch "name=\""(.+?)\"""))
{
continue
}
$name = $matches[1]
if(-not($match[0] -imatch "value=\""(.+?)\"""))
{
continue
}
$value = $matches[1]
$inputs.Add($name, $value)
}
# Lookup for activate button's id
$searchString = ""
if ($activate)
{
$searchString = "ActivateSolutionItem"
}
else
{
$searchString = "DeactivateSolutionItem"
}
$match = $strResponse -imatch "__doPostBack\(\&\#39\;(.*?$searchString)\&\#39\;"
$inputs.Add("__EVENTTARGET", $Matches[1])
$response.Close()
$response.Dispose()
# Format inputs as postback data string, but ignore the one that ends with iidIOGoBack
$strPost = ""
foreach ($inputKey in $inputs.Keys)
{
if (-not([String]::IsNullOrEmpty($inputKey)) -and -not($inputKey.EndsWith("iidIOGoBack")))
{
$strPost += [System.Uri]::EscapeDataString($inputKey) + "=" + [System.Uri]::EscapeDataString($inputs[$inputKey]) + "&"
}
}
$strPost = $strPost.TrimEnd("&")
$postData = [System.Text.Encoding]::UTF8.GetBytes($strPost);
# Build postback request
$activateRequest = $context.WebRequestExecutorFactory.CreateWebRequestExecutor($context, $solutionPageUrl).WebRequest
$activateRequest.Method = "POST"
$activateRequest.Accept = "text/html, application/xhtml+xml, */*"
if ($context.Credentials -ne $null)
{
$activateRequest.CookieContainer = $cookieContainer
}
else
{
# No specific authentication required
$activateRequest.UseDefaultCredentials = $true
}
$activateRequest.ContentType = "application/x-www-form-urlencoded"
$activateRequest.ContentLength = $postData.Length
$activateRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
$activateRequest.Headers["Cache-Control"] = "no-cache";
$activateRequest.Headers["Accept-Encoding"] = "gzip, deflate";
$activateRequest.Headers["Accept-Language"] = "fr-FR,en-US";
# Add postback data to the request stream
$stream = $activateRequest.GetRequestStream()
$stream.Write($postData, 0, $postData.Length)
$stream.Close();
$stream.Dispose()
# Perform the postback
$response = $activateRequest.GetResponse()
$response.Close()
$response.Dispose()
上下文
$context = New-Object Microsoft.SharePoint.Client.ClientContext($xmlContent.sites.site.Url)
$context.Credentials = $spoCredentials
$context.RequestTimeOut = 500 * 60 * 10;
$web = $context.Web
$site = $context.Site
$context.Load($web)
$context.Load($site)
try
{
$context.ExecuteQuery()
$ spoCredentials
$spoCredentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($xmlContent.sites.site.Username, $SecurePassword)
答案 0 :(得分:0)
您是否已在清单文件中添加了外部端点。您需要添加端点的URL,以便应用程序具有访问外部端点的权限。
这是一个代码示例的链接,如何执行/查询外部端点和其他来源,例如:Web应用程序,主机应用程序或网站集等等。
http://blog.ctp.com/2014/06/23/data-access-in-sharepoint-hosted-apps/