Дополнение к вопросу 1. Вы пытаетесь настроить непрерывную интеграцию? Для непрерывной интеграции с функциями Azure вы можете ссылаться на следующее:
https://azure.microsoft.com/en-us/documentation/articles/functions-continuous-deployment/#setting-up-continuous-deployment
http://flgmwt.github.io/azure/azure-functions/c-sharp/2016/04/04/azure-fns-with-ci.html
-- Обновление от 17 октября --
Ниже приведены шаги, характерные для Team Services:
Убедитесь, что ваша учетная запись VSTS связана с подпиской Azure. Следуйте инструкциям в этом статья.
Перейдите на портал функций для своего приложения-функции и нажмите Настройки приложения-функции -> Настроить непрерывную интеграцию.
В колонке Развертывания нажмите Настройка и настройте информацию о источнике развертывания (см. образец снимка ниже). Нажмите кнопку ОК. Подождите, пока синхронизация пройдет успешно. Закройте колонку Развертывания.
![введите здесь описание изображения](https://i.stack.imgur.com/R5Q4p.jpg)
- Подождите минуту и обновите сеанс портала функций. Теперь вы должны увидеть функцию, добавленную на ваш сайт функций. На снимке ниже показана моя функция AddressLookup, которая была синхронизирована с моим проектом Team Services под названием MyFirstProject.
Обратите внимание на сообщение об отказе от ответственности над редактором кода. Если вы подключите CI для своей функции, вы не сможете редактировать ее на портале функций. Поскольку для этого конкретного примера требуется тело запроса, вам нужно будет протестировать его с помощью Postman.
![введите здесь описание изображения](https://i.stack.imgur.com/4OUaV.jpg)
--Конец обновления 17 октября--
Ответ на вопрос 2. Вот хорошая документация, описывающая структуру папок в Функциях Azure: https://azure.microsoft.com/en-us/documentation/articles/functions-reference/
Я также рекомендую дополнительную документацию по разработке C# для Функций Azure: https://azure.microsoft.com/en-us/documentation/articles/functions-reference-csharp/
Ответы на Q3 и Q4: я попытаюсь ответить на них, предоставив пример реализации. У меня нет никакого контекста реализации вашей библиотеки AddressLookup, однако в интересах предоставления примера я собираюсь сделать дикий прыжок и предположить, что это библиотека, которая будет выполнять некоторые операции геокодирования. Предполагая, что вы хотите использовать эту библиотеку в функции, запускаемой HTTP, вы можете начать с создания AddressLookup.dll
, а затем загрузить ее в папку bin
внутри вашей функции. Затем вы можете ссылаться на эту DLL из своего функционального сценария.
Например, взяв за основу эту статью, Я создал библиотеку AddressLookup.dll
в Visual Studio со следующей реализацией. Эта DLL будет служить прокси для вашей библиотеки AddressLookup, чтобы я мог продемонстрировать, как мы можем использовать ее в функции.
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Xml.Linq;
namespace AddressLookup
{
public class GeoLocation
{
public double Longitude { get; set; }
public double Latitude { get; set; }
}
public class GeoCoder
{
private const string geoCodeLookupUrlPattern =
"https://maps.googleapis.com/maps/api/geocode/xml?address={0}&key={1}";
private const string addressLookupUrlPattern =
"https://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&key={2}";
private string _apiKey = null;
public GeoCoder(string apiKey)
{
if (string.IsNullOrEmpty(apiKey))
{
throw new ArgumentNullException("apiKey");
}
_apiKey = apiKey;
}
public GeoLocation GetGeoLocation(string address)
{
GeoLocation loc = null;
string encodedAddress = HttpUtility.UrlEncode(address);
string url = string.Format(geoCodeLookupUrlPattern, encodedAddress, _apiKey);
WebRequest request = WebRequest.Create(url);
using (WebResponse response = request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
if (stream != null)
{
XDocument document = XDocument.Load(new StreamReader(stream));
XElement longitudeElement = document.Descendants("lng").FirstOrDefault();
XElement latitudeElement = document.Descendants("lat").FirstOrDefault();
if (longitudeElement != null && latitudeElement != null)
{
loc = new GeoLocation
{
Longitude = Double.Parse(longitudeElement.Value, CultureInfo.InvariantCulture),
Latitude = Double.Parse(latitudeElement.Value, CultureInfo.InvariantCulture)
};
}
}
}
}
return loc;
}
public string GetAddress(GeoLocation loc)
{
string address = null;
string url = string.Format(addressLookupUrlPattern, loc.Latitude, loc.Longitude, _apiKey);
WebRequest request = WebRequest.Create(url);
using (WebResponse response = request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
if (stream != null)
{
XDocument document = XDocument.Load(new StreamReader(stream));
XElement element = document.Descendants("formatted_address").FirstOrDefault();
if (element != null)
{
address = element.Value;
}
}
}
}
return address;
}
}
}
Теперь давайте создадим функцию, активируемую HTTP, выполнив следующие шаги:
- Перейдите на Портал функций. Создайте функцию, используя шаблон HTTP Trigger — C#.
- Введите имя (например,
AddressLookup
) и уровень авторизации (например, Anonymous
). Теперь вы должны увидеть функцию с именем AddressLookup, созданную с предварительно заполненным кодом.
- На левой панели нажмите кнопку Настройки приложения-функции.
- Необязательно: нажмите Настроить параметры приложения. В разделе "Настройки приложения" добавьте значение ключа
GoogleMapsAPIKey
с помощью ключа API, затем нажмите кнопку Сохранить. Примечание. Если вы пропустите этот шаг, позже вам потребуется жестко закодировать ключ в коде функции.
Затем используйте службу Kudu для загрузки DLL. Нажмите кнопку Перейти к Куду. Это запустит новое окно браузера с консолью cmd. Введите следующее, чтобы перейти в каталог функций:
cd site\wwwroot\AddressLookup
Создайте папку bin
, введя mkdir bin
в командной строке следующим образом:
![введите здесь описание изображения](https://i.stack.imgur.com/vTXLym.png)
Дважды щелкните папку bin
и загрузить (см. "Добавить файлы") AddressLookup.dll
в папку. Когда вы закончите, вы должны сделать аналогичный снимок ниже,
![введите здесь описание изображения](https://i.stack.imgur.com/NvWbVm.png)
Вернитесь на портал функций. В редакторе вашей функции в нижней части раздела «Код» нажмите Просмотр файлов. Теперь вы должны увидеть только что созданную папку bin
следующим образом:
![введите здесь описание изображения](https://i.stack.imgur.com/hntPZm.png)
Замените содержимое предварительно заполненного скрипта функции следующим кодом.
#r "AddressLookup.dll"
using System;
using AddressLookup;
using System.Net;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");
// Reading environment variable from App Settings, replace with hardcoded value if not using App settings
string apiKey = System.Environment.GetEnvironmentVariable("GoogleMapsAPIKey", EnvironmentVariableTarget.Process);
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
string address = data?.address;
string name = data?.name;
GeoCoder geoCoder = new GeoCoder(apiKey);
GeoLocation loc = geoCoder.GetGeoLocation(address);
string formattedAddress = geoCoder.GetAddress(loc);
HttpResponseMessage message = null;
if (name == null)
{
message = req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name in the request body");
}
else
{
var msg = $"Hello {name}. Lon: '{loc.Longitude}', Lat: '{loc.Latitude}', Formatted address: '{formattedAddress}'";
message = req.CreateResponse(HttpStatusCode.OK, msg);
}
return message;
}
- Нажмите кнопку Сохранить.
В разделе «Выполнить» укажите следующее тело запроса:
{
"name": "Azure",
"address": "One Microsoft Way Redmond WA 98052"
}
Нажмите кнопку Выполнить.
- Вы должны увидеть некоторые записи журнала, похожие на следующие:
2016-10-15T03:54:31.538 C# HTTP trigger function processed a request. RequestUri=https://myfunction.azurewebsites.net/api/addresslookup
2016-10-15T03:54:31.773 Function completed (Success, Id=e4308c0f-a615-4d43-8b16-3a6afc017f73)
и следующее ответное сообщение HTTP,
"Hello Azure. Lon: '-122.1283833', Lat: '47.6393225', Formatted address: '1 Microsoft Way, Redmond, WA 98052, USA'"
Поскольку это функция, активируемая HTTP, вы также можете протестировать свою функцию с помощью Postman. См. снимок ниже,
![введите здесь описание изображения](https://i.stack.imgur.com/UAF92.png)
Если вы загрузите свою собственную DLL на шаге 5 и отредактируете код функции для вызова вашей библиотеки, функция должна работать так же хорошо.
person
Ling Toh
schedule
15.10.2016