#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 ?