我无法访问SharePoint网站中的Excel文件,未经授权的异常,错误代码401

问题描述

我正在尝试访问位于SharePoint站点上的Excel文件。我没有从服务器端进行修改的选择。我可以从chrome访问文件,当我输入链接时,文件自动下载。但是,当我尝试使用C#代码(.Net框架4.6.1)下载时,出现了未经授权的异常,401错误代码。 我尝试了几件事。 首先,我尝试了CSOM(客户端共享点对象模型)。代码如下

!SESSION 2020-09-01 12:40:51.755 -----------------------------------------------
eclipse.buildId=4.15.0.I20200305-0155
java.version=1.8.0_251
java.vendor=Oracle Corporation
BootLoader constants: OS=win32,ARCH=x86_64,WS=win32,NL=en_IN
Framework arguments:  -product org.eclipse.epp.package.java.product
Command-line arguments:  -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product

!ENTRY org.eclipse.cdt.docker.launcher 4 0 2020-09-01 12:40:54.258
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: org.eclipse.cdt.docker.launcher [673]
  Unresolved requirement: Require-Bundle: org.eclipse.linuxtools.docker.core; bundle-version="[4.0.0,5.0.0)"
    -> Bundle-SymbolicName: org.eclipse.linuxtools.docker.core; bundle-version="4.7.0.202006092019"; singleton:="true"
       org.eclipse.linuxtools.docker.core [763]
         Unresolved requirement: Import-Package: javax.xml.bind; version="2.3.3"
  Unresolved requirement: Require-Bundle: org.eclipse.linuxtools.docker.ui; bundle-version="[4.0.0,5.0.0)"
    -> Bundle-SymbolicName: org.eclipse.linuxtools.docker.ui; bundle-version="4.7.0.202006092019"; singleton:="true"
       org.eclipse.linuxtools.docker.ui [766]
         Unresolved requirement: Import-Package: javax.xml.bind; version="2.3.3"

    at org.eclipse.osgi.container.Module.start(Module.java:462)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1844)
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:136)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1837)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1778)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1742)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1664)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)

!ENTRY org.eclipse.linuxtools.docker.core 4 0 2020-09-01 12:40:54.310
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: org.eclipse.linuxtools.docker.core [763]
  Unresolved requirement: Import-Package: javax.xml.bind; version="2.3.3"

    at org.eclipse.osgi.container.Module.start(Module.java:462)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1844)
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:136)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1837)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1778)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1742)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1664)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)

!ENTRY org.eclipse.linuxtools.docker.ui 4 0 2020-09-01 12:40:54.357
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: org.eclipse.linuxtools.docker.ui [766]
  Unresolved requirement: Import-Package: javax.xml.bind; version="2.3.3"

    at org.eclipse.osgi.container.Module.start(Module.java:462)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1844)
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:136)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1837)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1778)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1742)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1664)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)

之后,我回到传统方法并使用了HttpClient。代码如下

static void Main(string[] args)
        {
            var link2 = @"File link";
            ClientContext context = new ClientContext(link2);

            Web web = context.Web;
            context.ExecutingWebRequest += clientContext_ExecutingWebRequest;
            context.Credentials = CredentialCache.DefaultCredentials;
            context.Load(web);

            ExceptionHandlingScope scope = new ExceptionHandlingScope(context);

            using (scope.StartScope())
            {
                using (scope.StartTry())
                {
                    context.ExecuteQuery();// <- Unautherized exception
                    Console.WriteLine(web.Title);
                }
                using (scope.StartCatch())
                {
                    Console.WriteLine(scope.ServerStackTrace);
                }

            }

            Console.ReadLine();

        }
        static void clientContext_ExecutingWebRequest(object sender,WebRequestEventArgs e)
        {
            e.WebRequestExecutor.WebRequest.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED","f");
        }

我对sharepoint还是陌生的,我感谢任何帮助。提前致谢。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 再次试用

static void Main(string[] args)
        {
            var link = @"sitelink";
            var link2 = @"filelink";

            var credential = new CredentialCache
            {
                { new Uri(link2),"NTLM",CredentialCache.DefaultNetworkCredentials}
            };

            var options = new httpclienthandler
            {
                Credentials = credential
            };

            //var client = new HttpClient(options);

            using (var client = new HttpClient(options))
            {
                var requestMessage = new HttpRequestMessage();
                requestMessage.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED","f");
                requestMessage.Method = HttpMethod.Get;
                requestMessage.RequestUri = new Uri(link2);
                requestMessage.Headers.Add("Use-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/84.0.4147.135 Safari/537.36");
                var response = client.SendAsync(requestMessage).Result;
                Console.WriteLine(JsonConvert.SerializeObject(response,Formatting.Indented));
                if (response != null && response.IsSuccessstatusCode)// <- Status false,Unautherized is in the response header
                {
                    using (var reader = new io.StreamReader(response.Content.ReadAsstreamAsync().Result))
                    {
                        io.File.WriteallText(@"C:\Users\Name\source\repos\TestExcel.xlsx",reader.ReadToEndAsync().Result );
                    }
                        
                }
            }

            Console.WriteLine("DOne");
        }

完成序列化异常对象

var link2 = @"file link";

            var client = new HttpClient(new httpclienthandler
            {
                UseDefaultCredentials = true
            });

            io.Stream resultStream = null;
            try
            {
                resultStream = client.GetStreamAsync(link2).Result;
                var reader = new io.StreamReader(resultStream);
                io.File.WriteallText(@"C:\Users\Name\source\repos\TestExcel.xlsx",reader.ReadToEndAsync().Result);
                reader.Close();
            } catch (Exception e)
            {
                Console.WriteLine(JsonConvert.SerializeObject(e,Formatting.Indented));
            }
            
            Console.WriteLine("Done");
            Console.ReadLine();

更新 Sharepoint托管在Office 365中。 看来Office 365正在处理授权。当我使用chrome dev工具进行检查时,在源文件中找到了两个js文件(我在这里不能提及的名称)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)