Функция Azure, использующая API OneDrive, возвращает ошибки компиляции

#c# #onedrive #azure-functions

#c# #onedrive #azure-функции

Вопрос:

Я хочу создать метод Azure function (C # API Generic HTTP), который загружает файл в библиотеку документов Office365 Sharepoint.
Поскольку OneDrive API позволяет мне загружать большие файлы (используя daemon process amp; certificate auth.), мне удалось достичь цели с помощью консольного приложения C #. Идея заключалась бы в том, чтобы теперь переместить код в функцию Azure. Однако я получаю сообщение об ошибке во время сохранения / компиляции.

Код:

 #r "Newtonsoft.Json"

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Security.Cryptography.X509Certificates;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Threading.Tasks;

public class DriveResult
{
    [JsonProperty("@odata.id")]
    public string id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

const string appId = "<myAppId>";
const string tenantName = "<tenantName>";
const string tenantId = "<myTenantId>";


private static string GetResourceUrl()
{
    return "https://"   tenantName   ".sharepoint.com";
}

private static string GetAuthority()
{
    return "https://login.windows.net/"   tenantId   "/oauth2/authorize";
}

public static async Task<bool> Run(HttpRequestMessage req, TraceWriter log)
{
    var token = await GetAccessTokenAsync();
    return true; //temporary code
}

private static async Task<string> GetAccessTokenAsync()
{
    AuthenticationContext authenticationContext = new AuthenticationContext(GetAuthority(), false);
    string certfile = @"mykeyfile.pfx";

    X509Certificate2 cert = new X509Certificate2(certfile, "<myinsanepwd>");

    ClientAssertionCertificate cac = new ClientAssertionCertificate(appId, cert);
    var authenticationResult = await authenticationContext.AcquireTokenAsync("GetResourceUrl()", cac);
    return authenticationResult.AccessToken;
}

Project.json
{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.5",
          "System.Security.Cryptography.X509Certificates": "4.1.0"
      }
    }
   }
}

Function.json
{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ],
  "disabled": false
}
  

Ошибки во время компиляции :

 2016-10-22T13:05:24.625 run.csx(50,60): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
2016-10-22T13:05:24.625 run.csx(50,38): error CS0012: The type 'Task<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
  

Почему он жалуется? Функции выполняются на .NET 4.6.

С наилучшими пожеланиями, Йенс

Ответ №1:

В качестве альтернативы, если вы хотите прочитать / записать из / в OneDrive или фактически любого другого поставщика SaaS на основе файлов, такого как DropBox, GoogleDrive, Box, … возможно, вы захотите попробовать запуск файла SaaS, ввод или вывод в Azure functions.

Вот пример C #:

https://github.com/Azure/azure-webjobs-sdk-templates/tree/dev/Templates/SaaSFileTrigger-CSharp

Ответ №2:

Йенс,

Это проблема, вызванная некоторыми случаями при обращении к спискам рассылки.

У нас есть план более постоянного решения, но в то же время вы должны иметь возможность скомпилировать свою функцию, добавив явные ссылки на нужные вам сборки, как вы сделали с JSON.NET. Итак, в вашем случае следующее:

 #r "System.Runtime"
#r "System.Threading.Tasks"
  

Надеюсь, это поможет!

Комментарии:

1. Привет, Фабио, это действительно устраняет ошибку компиляции. однако,

2. строка X509Certificate2 cert = new X509Certificate2(файл сертификата, «<mypwd>»); выдает систему исключений. Безопасность. Криптография. Исключение CryptographicException: система не может найти указанный файл. Действительно странно, потому что файл существует по указанному пути (я проверил с помощью File. Существует ()) P.S. Я заметил, что текущий каталог функции Azure установлен в D:Windowssystem32

3. Можете ли вы попробовать передать абсолютный путь (вместо просто имени файла), созданный следующим образом: System.IO.Path. Объединить (Environment.ExpandEnvironmentVariables(«%HOME%»), @»site wwwroot <YOURFUNCTIONNAME>mykeyfile.pfx»); Я открываю проблему на GitHub, чтобы мы могли поработать над предоставлением более удобного способа получения каталога функций.

4. Кроме того, в качестве альтернативы прямой работе с OneDrive, вы можете также рассмотреть ответ Хамида.

5. Привет, Фабио, я попробовал ваше решение, но оно выдает мне ту же ошибку. 🙁 Я бы хотел иметь пользовательскую конечную точку больше вместо ответа Хамида. (что, конечно, тоже здорово.) Файл, однако, извлекается правильно (Файл. Exists() доказывает это) Может ли это иметь какое-то отношение к support.microsoft.com/en-us/kb/948154 ?