Azure Webjob在本地运行良好,但它不能在Azure门户上运行

时间:2017-10-12 05:54:51

标签: c# azure sharepoint-2013 azure-webjobs

我有一个我作为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();
        }

    }
}

2 个答案:

答案 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.");
    }

enter image description here