当前位置: 代码迷 >> SharePoint >> [] C#本地app对sharepoint 2013 文件进行签入签出发生403异常
  详细解决方案

[] C#本地app对sharepoint 2013 文件进行签入签出发生403异常

热度:308   发布时间:2016-05-02 06:56:16.0
[求助] C#本地app对sharepoint 2013 文件进行签入签出发生403错误
因为现实需要,我们把在sharepoint上的文件同步到本地,
然后用本地app软件连接sharepoint网站对该文件进行文件签出,然后更新文件内容,再进行文件签入。
实验账户是有签入签出权限的。

本站https://mycompany.com/teams/Shanghai
但是会自动进入https://mycompany.com/teams/Shanghai/SitePages/Summary.aspx
所有目标文件都在https://mycompany.com/teams/Shanghai/_layouts/15/viewlsts.aspx页面Documents下,
点击进入https://mycompany.com/teams/Shanghai/Documents/Forms/AllItems.aspx可看到文件列表。

代码如下:

using Microsoft.SharePoint;

......

                    using (Microsoft.SharePoint.Client.ClientContext client = new Microsoft.SharePoint.Client.ClientContext("https://mycompany.com/teams/Shanghai"))
                    {
                        client.Credentials = new NetworkCredential("myAlias", "myPW", "myArear");

                        var list = client.Web.Lists.GetByTitle("Documents");
                        //client.ExecuteQuery(); //如果运行本句,就会出现403 forbidden错误。
                        foreach (var file in list.RootFolder.Files) // 出现错误 "The collection has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested."
                        {
                            Console.WriteLine(file.Name);
                        }
                        var findFile = list.RootFolder.Files.GetByUrl(fileName);// fileName是文件名,“a.txt”这样。

                        findFile.CheckOut();
                        client.Load(findFile);
                        client.ExecuteQuery();

                        RefreshExcel();//刷新文件内容

                        findFile.CheckIn("Updated", Microsoft.SharePoint.Client.CheckinType.OverwriteCheckIn);
                        client.Load(findFile);
                        client.ExecuteQuery();
                    }


请问我的代码哪里有错,应该怎么改?
拜谢各位!
------解决思路----------------------
403是没有认证,在执行之前加一个认证试试:
NetworkCredential credentials = new NetworkCredential("username", "pwd", "domain");
clientContext .Credentials = credentials;

或者直接使用window集成认证:
clientContext.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
------解决思路----------------------
using Microsoft.SharePoint;
我看有这个引用,你是在服务器上操作的?如果在服务器上操作,用服务器端对象模型,然后提升权限操作,就不会有没权限的情况了;
------解决思路----------------------
参考一下这篇文章,和你的需求有点儿像:
http://www.cnblogs.com/awpatp/archive/2013/03/14/2960551.html

先获取web,再获取list,再执行操作试试。我本地VS有点儿问题,没试,你先试试行不行吧。
------解决思路----------------------
参考 http://msdn.microsoft.com/zh-cn/library/office/ee534956(v=office.14).aspx 
 
1.在 var list = client.Web.Lists.GetByTitle("Documents"); 之后,不需要调用client.ExecuteQuery(); 
2. 在foreach遍历之前,需要load files的集合。否则这个集合是没有被初始化的,就得到的你那个错误。

下面的代码是获取listitem的,但是逻辑和后去file是一样的,参考一下吧。

static void Main()
        {
            string siteUrl = "http://MyServer/sites/MySiteCollection";

            ClientContext clientContext = new ClientContext(siteUrl);
            SP.List oList = clientContext.Web.Lists.GetByTitle("Announcements");

            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = "<View><Query><Where><Geq><FieldRef Name='ID'/>" +
                "<Value Type='Number'>10</Value></Geq></Where></Query><RowLimit>100</RowLimit></View>";
            ListItemCollection collListItem = oList.GetItems(camlQuery);

            clientContext.Load(collListItem);

            clientContext.ExecuteQuery();

            foreach (ListItem oListItem in collListItem)
            {
                Console.WriteLine("ID: {0} \nTitle: {1} \nBody: {2}", oListItem.Id, oListItem["Title"], oListItem["Body"]);
            }
        }


------解决思路----------------------
你确定这个账号有权限?
client.Credentials = new NetworkCredential("myAlias", "myPW", "myArear");
授权就是这样的~
------解决思路----------------------
引用:
Code 已经修改了,但是就是一访问client.ExecuteQuery(); 就报403,明明这个账户我直接web页面访问时可以编辑/签入签出/下载/同步……都可以做的,真是快疯了,大哥们能帮忙分析下可能问题出在哪里吗?

                    using (Microsoft.SharePoint.Client.ClientContext client = new Microsoft.SharePoint.Client.ClientContext("https://mycompany.com/teams/Shanghai"))
                    {
                        // Get credential
                        //client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                        client.Credentials = new NetworkCredential("myAlias", "myPW", "myArear");

                        // Get web
                        Web oWebsite = client.Web;
                        client.Load(oWebsite);
                        client.ExecuteQuery(); // 在这一步就错,403 forbidden。

                        // Get list
                        var list = client.Web.Lists.GetByTitle("Documents");
                        client.Load(list);
                        var findFile = list.RootFolder.Files.GetByUrl(fileName);

                        findFile.CheckOut();
                        client.Load(findFile);
                        client.ExecuteQuery();

                        RefreshExcel();

                        findFile.CheckIn("Updated", Microsoft.SharePoint.Client.CheckinType.OverwriteCheckIn);
                        client.Load(findFile);
                        client.ExecuteQuery();
                    }


很可能是由于https导致的。需要加一些代码绕过证书验证。

参考一下 http://www.cnblogs.com/Skypurple/archive/2011/04/12/2014134.html
和你的问题一样。
  相关解决方案