Azure Functions 系結運算式模式
觸發程式和系結最強大的功能之一是系結表達式。 在 function.json 檔案和函式參數和程式代碼中,您可以使用解析為各種來源值的運算式。
大多數運算式會藉由以大括號裹住來供您識別。 例如,在佇列觸發程式函式中, {queueTrigger}
解析為佇列消息正文。 path
如果 Blob 輸出系結的 屬性是 container/{queueTrigger}
,而且函式是由佇列訊息HelloWorld
觸發,則會建立名為 HelloWorld
的 Blob。
繫結運算式的類型
系結表達式 - 應用程式設定
最佳做法是使用應用程式設定來管理秘密和 連接字串,而不是組態檔。 這會限制對這些秘密的存取,並安全地將檔案儲存在公用原始檔控制存放庫中,例如 function.json 。
每當您想要根據環境變更組態時,應用程式設定也很有用。 例如,在測試環境中,您可能想要監視不同的佇列或 Blob 記憶體容器。
應用程式設定系結表達式的識別方式與其他系結運算式不同:它們會以百分比符弧括住,而不是大括弧。 例如,如果 Blob 輸出系結路徑是 %Environment%/newblob.txt
,而 Environment
應用程式設定值為 Development
,則會在容器中 Development
建立 Blob。
當函式在本機執行時,應用程式設定值來自 local.settings.json 檔案。
注意
connection
觸發程式和系結的 屬性是特殊案例,並會自動解析值作為應用程式設定,而不需要百分比符號。
下列範例是 Azure 佇列記憶體觸發程式,其會使用應用程式設定 %input_queue_name%
來定義要觸發的佇列。
{
"bindings": [
{
"name": "order",
"type": "queueTrigger",
"direction": "in",
"queueName": "%input_queue_name%",
"connection": "MY_STORAGE_ACCT_APP_SETTING"
}
]
}
您可以在類別庫中使用相同的方法:
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("%input_queue_name%")]string myQueueItem,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}
觸發程序檔案名稱
path
Blob 觸發程式的 可以是一種模式,可讓您參考其他系結和函式程式代碼中觸發 Blob 的名稱。 模式也可以包含篩選準則,指定哪些 Blob 可以觸發函式調用。
例如,在下列 Blob 觸發程式系結中, path
模式為 sample-images/{filename}
,它會建立名為 的 filename
系結表達式:
{
"bindings": [
{
"name": "image",
"type": "blobTrigger",
"path": "sample-images/{filename}",
"direction": "in",
"connection": "MyStorageConnection"
},
...
filename
運算式接著可以在輸出系結中使用,以指定要建立的 Blob 名稱:
...
{
"name": "imageSmall",
"type": "blob",
"path": "sample-images-sm/{filename}",
"direction": "out",
"connection": "MyStorageConnection"
}
],
}
函式程式代碼可以使用 做為參數名稱來存取這個相同的值 filename
:
// C# example of binding to {filename}
public static void Run(Stream image, string filename, Stream imageSmall, ILogger log)
{
log.LogInformation($"Blob trigger processing: {filename}");
// ...
}
使用系結運算式和模式的相同功能適用於類別庫中的屬性。 在下列範例中,屬性建構函式參數與上述function.json範例的值相同path
:
[FunctionName("ResizeImage")]
public static void Run(
[BlobTrigger("sample-images/{filename}")] Stream image,
[Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
string filename,
ILogger log)
{
log.LogInformation($"Blob trigger processing: {filename}");
// ...
}
您也可以建立檔名部分的運算式。 在下列範例中,函式只會在符合模式的檔名上觸發: anyname-anyfile.csv
{
"name": "myBlob",
"type": "blobTrigger",
"direction": "in",
"path": "testContainerName/{date}-{filetype}.csv",
"connection": "OrderStorageConnection"
}
如需如何在 Blob 路徑字串中使用運算式和模式的詳細資訊,請參閱 記憶體 Blob 系結參考。
觸發程序中繼資料
除了觸發程式所提供的數據承載之外,許多觸發程式還提供額外的元數據值,例如觸發函式的佇列訊息內容。 這些值可用於 C# 和 F# 中的輸入參數,或 JavaScript 中物件上的 context.bindings
屬性。
例如,Azure 佇列記憶體觸發程式支援下列屬性:
- QueueTrigger - 如果有效的字串,則觸發訊息內容
- DequeueCount
- ExpirationTime
- Id
- 插入時間
- NextVisibleTime
- PopReceipt
這些元數據值可在檔案屬性function.json存取。 例如,假設您使用佇列觸發程式,而佇列訊息包含您想要讀取的 Blob 名稱。 在function.json檔案中,您可以在 blob path
屬性中使用queueTrigger
元數據屬性,如下列範例所示:
{
"bindings": [
{
"name": "myQueueItem",
"type": "queueTrigger",
"queueName": "myqueue-items",
"connection": "MyStorageConnection",
},
{
"name": "myInputBlob",
"type": "blob",
"path": "samples-workitems/{queueTrigger}",
"direction": "in",
"connection": "MyStorageConnection"
}
]
}
對應參考文章會說明每個觸發程式的元數據屬性詳細數據。 如需範例,請參閱 佇列觸發程式元數據。 您也可以在入口網站的 [整合] 索引標籤中,於系結組態區域下方的 [檔] 區段中取得檔。
JSON 承載
在某些情況下,您可以參考相同函式和函式程序代碼中其他系結之組態中的觸發程式承載屬性。 這需要觸發程式承載為 JSON,而且小於每個觸發程式特定的臨界值。 一般而言,承載大小必須小於 100MB,但您應該檢查每個觸發程式的參考內容。 使用觸發程式承載屬性可能會影響應用程式的效能,而且會強制觸發程序參數類型為簡單類型,例如字串或代表 JSON 資料的自定義物件類型。 它不能與數據流、用戶端或其他 SDK 類型搭配使用。
下列範例顯示 webhook 函式 的function.json檔案,該函式會以 JSON 接收 Blob 名稱: {"BlobName":"HelloWorld.txt"}
。 Blob 輸入系結會讀取 Blob,而 HTTP 輸出系結會傳回 HTTP 回應中的 Blob 內容。 請注意,Blob 輸入系結會直接 BlobName
參考 屬性來取得 Blob 名稱 ("path": "strings/{BlobName}"
)
{
"bindings": [
{
"name": "info",
"type": "httpTrigger",
"direction": "in",
"webHookType": "genericJson"
},
{
"name": "blobContents",
"type": "blob",
"direction": "in",
"path": "strings/{BlobName}",
"connection": "AzureWebJobsStorage"
},
{
"name": "res",
"type": "http",
"direction": "out"
}
]
}
若要在 C# 和 F# 中運作,您需要一個類別來定義要還原串行化的欄位,如下列範例所示:
using System.Net;
using Microsoft.Extensions.Logging;
public class BlobInfo
{
public string BlobName { get; set; }
}
public static HttpResponseMessage Run(HttpRequestMessage req, BlobInfo info, string blobContents, ILogger log)
{
if (blobContents == null) {
return req.CreateResponse(HttpStatusCode.NotFound);
}
log.LogInformation($"Processing: {info.BlobName}");
return req.CreateResponse(HttpStatusCode.OK, new {
data = $"{blobContents}"
});
}
在 JavaScript 中,會自動執行 JSON 還原串行化。
module.exports = async function (context, info) {
if ('BlobName' in info) {
context.res = {
body: { 'data': context.bindings.blobContents }
}
}
else {
context.res = {
status: 404
};
}
}
點表示法
如果 JSON 承載中的某些屬性是具有屬性的物件,您可以使用點 (.
) 表示法直接參考這些屬性。 此表示法不適用於 Azure Cosmos DB 或 數據表記憶體 系結。
例如,假設您的 JSON 看起來像這樣:
{
"BlobName": {
"FileName":"HelloWorld",
"Extension":"txt"
}
}
您可以直接 FileName
將 參考為 BlobName.FileName
。 使用此 JSON 格式時,以下是 path
上述範例中的 屬性外觀:
"path": "strings/{BlobName.FileName}.{BlobName.Extension}",
在 C# 中,您需要兩個類別:
public class BlobInfo
{
public BlobName BlobName { get; set; }
}
public class BlobName
{
public string FileName { get; set; }
public string Extension { get; set; }
}
建立 GUID
系 {rand-guid}
結表達式會建立 GUID。 檔案中的 function.json
下列 Blob 路徑會建立名稱如 50710cb5-84b9-4d87-9d83-a03d6976a682.txt 的 Blob。
{
"type": "blob",
"name": "blobOutput",
"direction": "out",
"path": "my-output-container/{rand-guid}.txt"
}
目前時間
系結表示式 DateTime
會解析為 DateTime.UtcNow
。 檔案中的 function.json
下列 Blob 路徑會建立名稱如 2018-02-16T17-59-55Z.txt的 Blob。
{
"type": "blob",
"name": "blobOutput",
"direction": "out",
"path": "my-output-container/{DateTime}.txt"
}
執行階段的繫結
在 C# 和其他 .NET 語言中,您可以使用命令式系結模式,而不是 function.json 和 屬性中的宣告式系結。 當繫結參數需要在執行階段而不是設計階段中計算時,命令式繫結非常有用。 若要深入瞭解,請參閱 C# 開發人員參考 或 C# 腳本開發人員參考。