我创建了一些使用触发器的Azure Webjobs,我刚刚学习了Azure Functions.
根据我的理解,Azure Functions似乎与Azure Webjobs功能重叠,我有一些难以理解何时在Function和Webjob之间进行选择:
与Webjobs不同,函数只能被触发,它不是为了运行连续过程而设计的(但您可以编写代码来创建连续函数).
您可以使用多种语言编写Webjobs和函数(C#,node.js,python ...),但您可以从Azure门户编写函数,以便更容易,更快地开发测试和部署函数.
Webjobs在App Service Web应用程序,API应用程序或移动应用程序的上下文中作为后台进程运行,而Function则使用Classic/Dynamic App Service Plan运行.
关于缩放,函数似乎提供了更多的可能性,因为您可以使用动态应用程序服务计划,并且您可以扩展单个函数,而对于webjob,您必须扩展整个Web应用程序.
因此,确定存在价格差异,如果您运行现有的Web应用程序,您可以使用它来运行webjob而无需任何额外费用但是如果我没有现有的Web应用程序而且我必须编写代码来触发队列我应该使用webjob还是函数?
您需要选择时还需要记住其他注意事项吗?
我有一个应用程序,我只是迁移到Azure.目前我使用web.config转换来管理更改数据库连接字符串dev/staging/prod环境.如何在Azure中管理这些多个连接字符串?
connection-string azure application-settings staging azure-sql-database
我在local.setting.json中设置本地主机端口.参考Microsoft doc https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local
该文件如下所示
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"AzureWebJobsDashboard": ""
},
"Host": {
"LocalHttpPort": 7073
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行/调试解决方案时,VS仍然在默认端口上托管应用程序(7071)
我已经检查了bin目录,该local.setting.json文件正在进行上述设置.从bin目录运行Azure Fucntion CLI(func host start)正确读取端口号.
看起来VS没有使用"LocalHttpPort"端口.设置中是否需要进行任何其他更改.我有Visual Studio 2017预览版(2)
我有一个项目引用2个软件包的问题,然后引用Newtonsoft.Json,但两个版本都不同.我使用的NuGet包Refit和Microsoft.NET.Sdk.Functions.当我尝试构建解决方案时,我收到以下错误:
C:\dev\noddy\noddy-api\src\noddy.Api>dotnet build
C:\dev\noddy\noddy-api\src\noddy.Api\noddy.Api.csproj : error NU1607: Version conflict detected for Newtonsoft.Json. Reference the package directly from the project to resolve this issue. \r
C:\dev\noddy\noddy-api\src\noddy.Api\noddy.Api.csproj : error NU1607: noddy.Api (>= 1.0.0) -> Refit (>= 4.0.1) -> Newtonsoft.Json (>= 10.0.3) \r
C:\dev\noddy\noddy-api\src\noddy.Api\noddy.Api.csproj : error NU1607: noddy.Api (>= 1.0.0) -> Microsoft.NET.Sdk.Functions (>= 1.0.2) -> Newtonsoft.Json (>= 9.0.1).
Run Code Online (Sandbox Code Playgroud)
现在,如果我按照它说的做,并直接从我的项目引用包,我在构建时会遇到另一个错误:
C:\dev\noddy\noddy-api\src\noddy.Api>dotnet add package Newtonsoft.Json
Writing C:\Users\joebloggs\AppData\Local\Temp\tmp7250.tmp
info : Adding PackageReference for package 'Newtonsoft.Json' into project 'C:\dev\noddy\noddy-api\src\noddy.Api\noddy.Api.csproj'.
log : Restoring packages …Run Code Online (Sandbox Code Playgroud) 我的Azure功能代码如下所示
public static class MyHttpTriggerFunction
{
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
// some business logic
if (valid)
{
return req.CreateResponse(HttpStatusCode.OK, true);
}
else
{
return req.CreateResponse(HttpStatusCode.BadRequest, "some error message");
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试项目中,我正在阅读如下结果:
var result = await MyHttpTriggerFunction.Run(req, log).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
执行该函数后,当它尝试在结果变量中返回响应时,测试方法失败并出现异常.
**
System.InvalidOperationException:请求没有关联的配置对象,或者提供的配置为null.
**
我确保测试项目具有相同的System.Net.Http.HttpRequestMessageExtensiondll.
如果我更改功能代码不使用CreateResponse扩展方法(此扩展方法来自VS 2017模板的代码)并返回如下所示的响应,我会在测试方法中获得响应并且测试用例运行正常.
var res = new HttpResponseMessage();
if (valid)
{
res.StatusCode = HttpStatusCode.OK;
res.Content = new ObjectContent<bool>(true, new JsonMediaTypeFormatter());
return res;
}
else …Run Code Online (Sandbox Code Playgroud) 在哪里可以找到有关组织具有多个Azure功能的Visual Studio解决方案的指导?具体来说,该项目应该如何组织?
单个Azure功能驻留在单个类文件中.我想每个函数都可以是它自己的类文件,都存储在一个项目中.但这是最佳解决方案还是由于项目组织/解决方案组织不当而面临未来的复杂风险?
我创建了一个Azure功能应用程序,其中包含一个Azure存储队列触发器,用于处理每个队列项都是URL的队列.该功能只下载URL的内容.我有另一个函数加载和解析站点的XML站点地图,并将所有页面URL添加到队列中.我遇到的问题是,功能应用程序运行得太快,它会破坏网站,使其开始返回服务器错误.有没有办法限制/限制功能应用程序运行的速度?
当然,我可以编写一个简单的Web作业来连续处理它们(或者使用一些异步但限制并发请求的数量),但我真的很喜欢Azure Functions的简单性并想尝试"无服务器"计算.
我们在vue.js应用程序中使用axios来访问Azure功能.现在我们收到这个错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8080' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)
我们试图以这种方式在函数中设置响应头:
context.res = {
body: response.data,
headers: {
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Origin': 'http://localhost:8080',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Request-Headers': 'X-Custom-Header'
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个错误?
我需要绑定到输出blob,但blob路径需要在我的函数中动态计算.我该怎么做?
我的函数是引用一个引用Microsoft.Extensions.Logging.Abstractions 2.0.0的程序集.如果我将该版本的nuget引用添加到函数的程序集中,则函数执行将失败:
[1/25/2018 11:14:46 PM] Microsoft.Azure.WebJobs.Host:错误索引方法'TrainingFunction.Run'.Microsoft.Azure.WebJobs.Host:无法将参数'log'绑定到类型ILogger.确保绑定支持参数Type.如果您正在使用绑定扩展(例如ServiceBus,Timers等),请确保您已在启动代码中调用扩展的注册方法(例如config.UseServiceBus(),config.UseTimers()等).
是否可以在Azure功能中使用较新的记录器?(SDK 1.0.7)