2017-04-06 120 views
1

我在Azure数据工厂中定制活动时遇到问题。 我想连接到它内的天蓝数据湖。 我使用下面的命名空间:Azure数据湖与数据工厂定制活动的连接

using Microsoft.Azure.Management.DataLake.Store; 
using Microsoft.IdentityModel.Clients.ActiveDirectory 
using Microsoft.Rest.Azure.Authentication; 

这里是我的代码:

public ConnectDataLakeStore(string applicationId, string applicationSecretKey, string tenantId) 
    { 
     var credentials = new ClientCredential(applicationId, applicationSecretKey); 
     var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, credentials).Result; 
     var fileSystemClient = new DataLakeStoreFileSystemManagementClient(creds); 
    } 

而且我得到以下异常:

Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Microsoft.Azure.Management.DataLake.Store.Models.AdlsErrorException: Operation returned an invalid status code 'Forbidden' 
    at Microsoft.Azure.Management.DataLake.Store.FileSystemOperations.<ListFileStatusWithHttpMessagesAsync>d__12.MoveNext() 

当我运行在本地环境中的所有自定义活动工作正常。在部署到Azure之后发生问题。我还将所有可能的权限授予广告应用程序。

任何提示?

+0

解决。 .NET Framework版本应该<= 4.5.2 – BRMaster

回答

0

我从上面的评论中了解到,您已经解决了这个问题。但仍然认为值得为未来的窥视增加更多的细节以解决类似的问题。

首先使用您的服务主体和域详细信息创建凭证。

方法:

private static ServiceClientCredentials AuthenticateAzure(string domainName, string clientID, string clientSecret) 
    { 
     SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); 

     var clientCredential = new ClientCredential(clientID, clientSecret); 
     return ApplicationTokenProvider.LoginSilentAsync(domainName, clientCredential).Result; 
    } 

也许从资料库中配置或项目属性获取值。

var creds = AuthenticateAzure(domainName, appId, appPass); 

接下来根据您的需要创建数据湖帐户管理器或文件系统管理器的实例。

private static DataLakeStoreFileSystemManagementClient adlsFileSystemClient; 
    private static DataLakeStoreAccountManagementClient adlsAccountManagementClient; 

    adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds); 
    adlsAccountManagementClient = new DataLakeStoreAccountManagementClient(creds); 

接下来,创建类似下面的方法将文件上传到数据储存湖。

上传程序的执行速度比创建文件方法快。

private static void UploadFile(string srcFilePath, string destFilePath, string accName, bool force = true) 
    { 
     var parameters = new UploadParameters(srcFilePath, destFilePath, accName, isOverwrite: force); 
     var frontend = new DataLakeStoreFrontEndAdapter(accName, adlsFileSystemClient); 
     var uploader = new DataLakeStoreUploader(parameters, frontend); 
     uploader.Execute(); 
    } 

来源:

ADF自定义活动 https://www.purplefrogsystems.com/paul/2016/11/creating-azure-data-factory-custom-activities/

ADL验证 https://www.purplefrogsystems.com/paul/2016/12/azure-data-lake-authentication-from-azure-data-factory/

希望这有助于