我有一个我作为webjob发布的控制台应用程序。此webjob的目的是从sharepoint站点读取数据。它在本地机器上工作正常,我能够读取数据。
但是,在将其部署到Azure App服务后,它无法正常工作。
获得以下错误
[10/12/2017 04:00:43 > 60bc6a: INFO] Cannot contact site at the specified URL http://flic.farahleisure.com/Sites/FLFIN.
[10/12/2017 04:00:43 > 60bc6a: INFO] at Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate()
[10/12/2017 04:00:43 > 60bc6a: INFO] at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest()
[10/12/2017 04:00:43 > 60bc6a: INFO] at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()
这是代码
using System;
using System.Configuration;
using System.Security;
using Microsoft.SharePoint.Client;
using System.Net;
using SP = Microsoft.SharePoint.Client;
namespace SampleApp
{
class Program
{
static void Main(string[] args)
{
try
{
using (ClientContext context = new ClientContext("http://flic.farahleisure.com/Sites/FLFIN"))
{
// Use default authentication mode
context.AuthenticationMode = ClientAuthenticationMode.Default;
context.Credentials = CredentialCache.DefaultNetworkCredentials;
// Specify the credentials for the account that will execute the request
context.Credentials = new NetworkCredential(GetSPOAccountName(), GetSPOSecureStringPassword(), GetSPODomainName());
ListCollection collList = context.Web.Lists;
context.Load(collList);
context.ExecuteQuery();
foreach (SP.List oList in collList)
{
Console.WriteLine("Title: {0}", oList.Title);
}
Console.WriteLine("Azure Web Job: Successfully completed.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
Console.ReadKey();
}
}
}
答案 0 :(得分:0)
这是一个很好的explanation:
你最有可能面对所谓的"双跳"问题:
您的客户端用户与Web应用程序连接并进行身份验证(通过Windows NTLM协议,要求客户端知道她/他的密码)。 Web应用程序使用模拟。这意味着代码以用户的身份运行。 使用您的context.Credentials = CredentialCache.DefaultNetworkCredentials,对SharePoint的调用尝试使用NTLM以用户身份进行身份验证。但是,这需要Web应用程序知道用户的密码:因为它没有,身份验证失败(除非客户端从Web应用程序服务器浏览Web应用程序,在这种情况下它可以正常工作)。 这里最简单的解决方案是避免在Web应用程序级别进行模拟(在web.config中);所有对SharePoint的请求都将在应用程序池的标识下生成(当然,这需要SharePoint下的权限)。
我在此处描述的另一个选项:将文件从SharePoint Server保存到共享文件夹 - 哪个用户帐户?。
答案 1 :(得分:0)
请尝试使用SharePointOnlineCredentials,我们也可以从Use Microsoft Azure WebJobs with Office 365.
获取演示代码// Use default authentication mode.
context.AuthenticationMode = ClientAuthenticationMode.Default;
//context.Credentials = CredentialCache.DefaultNetworkCredentials;
context.Credentials = new SharePointOnlineCredentials(GetSPOAccountName(), GetSPOSecureStringPassword());
<强>更新强>
请尝试使用 username @ domain ,我在本地测试或在Azure上发布,两者都在我这边正常工作。
using (ClientContext context = new ClientContext("sharepoint url"))
{
// Use default authentication mode
context.AuthenticationMode = ClientAuthenticationMode.Default;
// Specify the credentials for the account that will execute the request
var secureString = new SecureString();
foreach (char c in "password")
{
secureString.AppendChar(c);
}
context.Credentials = new SharePointOnlineCredentials("username@domain", secureString); //example username :tom@tomtest.com
ListCollection collList = context.Web.Lists;
context.Load(collList);
context.ExecuteQuery();
foreach (var oList in collList)
{
Console.WriteLine("Title: {0}", oList.Title);
}
Console.WriteLine("Azure Web Job: Successfully completed.");
}