Azure Function BlobTrigger:Microsoft.WindowsAzure.Storage:无法建立连接,因为目标机器主动拒绝它
Azure Function BlobTrigger: Microsoft.WindowsAzure.Storage: No connection could be made because the target machine actively refused it
我无法 运行 我在 java 中本地编写的 azure 函数,它应该基于 BlobTrigger 工作。
我遇到以下错误:
A host error has occurred
Microsoft.WindowsAzure.Storage: No connection could be made because the target machine actively refused it. System.Net.Http: No connection could be made because the target machine actively refused it. System.Private.CoreLib: No connection could be made because the target machine actively refused it.
这是我的代码:
public class Function {
@FunctionName("BlobTrigger")
@StorageAccount("reseaudiag")
public void blobTrigger(
@BlobTrigger(name = "content", path = "filer/{fileName}", dataType = "binary",
connection = "AzureWebJobsDashboard"
) byte[] content,
@BindingName("fileName") String fileName,
final ExecutionContext context
) {
context.getLogger().info("Java Blob trigger function processed a blob.\n Name: " + fileName + "\n Size: " + content.length + " Bytes");
}
}
仅基于最初的 运行,我可以开始实施逻辑,但我无法 运行 基本步骤本身。
这是我的 local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=XXX;AccountKey=confidential;EndpointSuffix=core.windows.net",
"AzureWebJobsDashboard": "UseDevelopmentStorage=true",
"DataConnectionString": "UseDevelopmentStorage=true",
"ContainerName": "filer"
},
"ConnectionStrings": {
"PlantaoEntities": {
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=confidential;EndpointSuffix=core.windows.net",
"ProviderName": "System.Data.EntityClient"
}
}
}
谢谢。
您的代码几乎是正确的。您需要在 blob 触发器中指定正确的连接。
这是我的成功示例:
package com.function;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
public class Function {
@FunctionName("BlobTrigger")
public void run(
@BlobTrigger(name = "trigger", path = "test/{fileName}", dataType = "binary", connection = "AzureWebJobsStorage") byte[] content,
@BindingName("fileName") String fileName,
final ExecutionContext context) {
context.getLogger().info("Blob: " + fileName + " -> Length: " + content.length);
}
}
我在我的代码中使用了"AzureWebJobsStorage"连接,所以我需要在local.settings.json中设置一个连接字符串:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=storagetest789;AccountKey=*******w==;EndpointSuffix=core.windows.net",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
然后,运行本地函数并上传文件到存储,我将得到如下输出:
注:
当您将应用发布到 Azure Function App 时,本地设置文件中的设置不会更新到云端。您需要手动更新它们。
请确保您已使您的存储帐户可访问。如果您为您的存储帐户启用防火墙,您需要添加您的客户端 IP 以进行本地测试,并允许受信任的 Microsoft 服务访问您的存储。
更新
- 如果您使用 VS Code 进行开发,您可以从命令面板上传本地设置:F1 -> "Upload Local Settings"
- 您还可以从 Azure 门户设置应用程序设置
然后您可以在这里修改设置:
我遇到了同样的问题,我真的花了将近 2 天的时间才解决。
这对我有用:
基本上,我必须删除位于 %USERPROFILE%/AzureEmulatorStorageDb[Number] 的数据库。其中 AzureEmulatorStrageDb[somenumber] 是它生成的数据库。
接下来,使用 cmd,导航到 Emulator 文件夹
cd C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator
然后通过运行以下命令初始化模拟器
AzureStorageEmulator.exe init /forceCreate
现在您应该可以 运行 azure 函数了,没有任何问题。
我无法 运行 我在 java 中本地编写的 azure 函数,它应该基于 BlobTrigger 工作。
我遇到以下错误:
A host error has occurred
Microsoft.WindowsAzure.Storage: No connection could be made because the target machine actively refused it. System.Net.Http: No connection could be made because the target machine actively refused it. System.Private.CoreLib: No connection could be made because the target machine actively refused it.
这是我的代码:
public class Function {
@FunctionName("BlobTrigger")
@StorageAccount("reseaudiag")
public void blobTrigger(
@BlobTrigger(name = "content", path = "filer/{fileName}", dataType = "binary",
connection = "AzureWebJobsDashboard"
) byte[] content,
@BindingName("fileName") String fileName,
final ExecutionContext context
) {
context.getLogger().info("Java Blob trigger function processed a blob.\n Name: " + fileName + "\n Size: " + content.length + " Bytes");
}
}
仅基于最初的 运行,我可以开始实施逻辑,但我无法 运行 基本步骤本身。
这是我的 local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=XXX;AccountKey=confidential;EndpointSuffix=core.windows.net",
"AzureWebJobsDashboard": "UseDevelopmentStorage=true",
"DataConnectionString": "UseDevelopmentStorage=true",
"ContainerName": "filer"
},
"ConnectionStrings": {
"PlantaoEntities": {
"ConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=confidential;EndpointSuffix=core.windows.net",
"ProviderName": "System.Data.EntityClient"
}
}
}
谢谢。
您的代码几乎是正确的。您需要在 blob 触发器中指定正确的连接。
这是我的成功示例:
package com.function;
import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;
public class Function {
@FunctionName("BlobTrigger")
public void run(
@BlobTrigger(name = "trigger", path = "test/{fileName}", dataType = "binary", connection = "AzureWebJobsStorage") byte[] content,
@BindingName("fileName") String fileName,
final ExecutionContext context) {
context.getLogger().info("Blob: " + fileName + " -> Length: " + content.length);
}
}
我在我的代码中使用了"AzureWebJobsStorage"连接,所以我需要在local.settings.json中设置一个连接字符串:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=storagetest789;AccountKey=*******w==;EndpointSuffix=core.windows.net",
"FUNCTIONS_WORKER_RUNTIME": "java"
}
}
然后,运行本地函数并上传文件到存储,我将得到如下输出:
注:
当您将应用发布到 Azure Function App 时,本地设置文件中的设置不会更新到云端。您需要手动更新它们。
请确保您已使您的存储帐户可访问。如果您为您的存储帐户启用防火墙,您需要添加您的客户端 IP 以进行本地测试,并允许受信任的 Microsoft 服务访问您的存储。
更新
- 如果您使用 VS Code 进行开发,您可以从命令面板上传本地设置:F1 -> "Upload Local Settings"
- 您还可以从 Azure 门户设置应用程序设置
然后您可以在这里修改设置:
我遇到了同样的问题,我真的花了将近 2 天的时间才解决。
这对我有用:
基本上,我必须删除位于 %USERPROFILE%/AzureEmulatorStorageDb[Number] 的数据库。其中 AzureEmulatorStrageDb[somenumber] 是它生成的数据库。
接下来,使用 cmd,导航到 Emulator 文件夹
cd C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator
然后通过运行以下命令初始化模拟器
AzureStorageEmulator.exe init /forceCreate
现在您应该可以 运行 azure 函数了,没有任何问题。