无法在线使用Sharepoint的SaveBinaryDirect始终返回403

时间:2017-11-15 22:03:25

标签: .net sharepoint shared-libraries sharepoint-online sharepoint-clientobject

我是SharePoint新手,

我正在尝试通过c#代码在文档库中上传图片。

有我的代码

# Configure Registry Keys
powershell_script 'Configure Registry Keys' do
    code <<-EOH

    # Set the default location for data files
    Set-ItemProperty -Path "HKLM:\\Software\\Microsoft\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQLServer" -Name DefaultData -Value "D:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA"

    # Set the default location for log files
    Set-ItemProperty -Path "HKLM:\\Software\\Microsoft\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQLServer" -Name DefaultLog -Value "L:\\Program Files\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQL\\DATA"

    # Set the default location for backup files
    Set-ItemProperty -Path "HKLM:\\Software\\Microsoft\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQLServer" -Name BackupDirectory -Value "B:\\sqlbackups"

    restart-service *sql* -force
    EOH
    guard_interpreter :powershell_script
    not_if "(Get-ItemProperty \"HKLM:\\Software\\Microsoft\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQLServer\").PSObject.Properties.Name -contains \"DefaultData\""
    not_if "(Get-ItemProperty \"HKLM:\\Software\\Microsoft\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQLServer\").PSObject.Properties.Name -contains \"DefaultLog\""
    not_if "(Get-ItemProperty \"HKLM:\\Software\\Microsoft\\Microsoft SQL Server\\MSSQL14.MSSQLSERVER\\MSSQLServer\").PSObject.Properties.Name -contains \"BackupDirectory\""
 end

但我总是得到403错误。

我还要验证这篇文章中是否提到了相同的问题,但我认为不是。

https://razirais.wordpress.com/2011/05/19/how-to-fix-sharepoint-online-403-forbidden-error-while-downloading-files-using-client-object-model/

当我这样做时,我收到405错误,并且fiddler日志显示请求正在尝试将上下文重定向到身份验证页面。

它有一个我需要启用的设置吗?知道我的麻烦是什么吗?

1 个答案:

答案 0 :(得分:2)

由于您已在SharePoint中对其进行了标记,因此我假设您仅在线使用SharePoint。

您需要将用户名和密码传递给ClientContext。因此,修改您的代码如下:

string webUrl = "https://mysharepointesite.sharepoint.com/";

string userName = "user.name@tenantname.onmicrosoft.com";
string password = "password";

using (ClientContext ctx = new ClientContext(webUrl))
{
    SecureString securePassword = new SecureString();
    foreach (char c in password.ToCharArray())
    {
        securePassword.AppendChar(c);
    }   

    ctx.AuthenticationMode = ClientAuthenticationMode.Default;
    ctx.Credentials = new SharePointOnlineCredentials(userName, securePassword);

    if (ctx != null)
    {
      var lib = ctx.Web.Lists.GetByTitle("mesdocuments");
      ctx.Load(lib);
      ctx.Load(lib.RootFolder);
      ctx.ExecuteQuery();
      string sourceUrl = "C:\\temp\\picture.jpg";          
      using (FileStream fs = new FileStream(sourceUrl, FileMode.Open, FileAccess.Read))
      {
        Microsoft.SharePoint.Client.File.SaveBinaryDirect (ctx, lib.RootFolder.ServerRelativeUrl + "/myPicture.jpg", fs, true);
      }
    }

}

另外,请确保使用正确的CSOM dll,即使用SharePoint在线CSOM SDK。查看您当前的实现,我认为您正在错误地使用客户端上下文导致错误。

您可以从下面提到的链接或使用Nuget(首选)下载最新的SDK。

如果您下载SDK,则可能需要从安装它的文件夹中手动引用dll。

通常,如果安装在C:驱动器中,则位置为:

C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI

从那里开始,您需要引用项目中的Microsoft.SharePoint.Client.dllMicrosoft.SharePoint.Client.Runtime.dll文件。

下载链接 - SharePoint Online Client Components SDK

Nuget包 - Microsoft.SharePointOnline.CSOM

此外,如果您不是传递用户名和密码的粉丝,则可以使用客户端ID和客户端密钥。要使用它,您可以查看我的回答here