Azure 函数 SignalR |协商功能 |失败并显示 500 错误代码
Azure Function SignalR | negotiate function | Fails with 500 error code
我已经使用 extensions.csproj 安装了 Microsoft.Azure.WebJobs.Extensions.SignalRService。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<WarningsAsErrors />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDB" Version="3.0.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.0.*" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.SignalRService" Version="1.0.0" />
</ItemGroup>
</Project>
我能够 post 使用以下 Azure 函数通过 Azure SignalR 服务发送消息。当 CosmosDB 集合中有任何 AddOrUpdate() 操作时会触发函数,它会在集线器中通过名称 'fruitUpdated' 发送信号。
#r "Microsoft.Azure.DocumentDB.Core"
#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
public static void Run(IReadOnlyList<Document> input, ILogger log, ICollector<SignalRMessage> signalRMessages)
{
if (input != null && input.Count > 0)
{
log.LogInformation("Documents modified " + input.Count);
foreach (var fruit in input)
{
signalRMessages.Add(
new SignalRMessage
{
Target = "fruitUpdated",
Arguments = new [] { fruit }
});
}
}
}
但是协商功能现在好像不能用了。它在没有任何线索的情况下抛出 500 错误代码。以下是示例,
run.csx
#r "Newtonsoft.Json"
using System;
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
public static IActionResult Run(HttpRequest req, ILogger log, object connectionInfo)
{
return (ActionResult)new OkObjectResult(connectionInfo);
}
function.json
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"methods": [
"get",
"post"
]
},
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "flights",
"direction": "in",
"connectionStringSetting": "AzureSignalRConnectionString"
}
]
}
我尝试了所有组合。 Azure 文档在某些情况下令人厌烦!没有输入\输出模式它应该是不受欢迎的。 Azure 产品团队应该认真对待它
SignalR 版本彼此不兼容。如果我们在服务器和客户端中使用不同版本的 SignalR dll,它们只是被动地关闭消息而不会抛出错误。
我想我需要 JSON connectionInfo 对象的负载。你能帮我一下吗?
我在 Serverless360 找到了答案。结果是类型问题和方法参数修饰。在引用了 SignalService 库和装饰器之后,它开始工作了。在我看来,object
是一个基本类型,它应该已经收到或注入了 connectionInfo。
#r "Newtonsoft.Json"
#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
public static IActionResult Run(HttpRequest req, ILogger log, [SignalRConnectionInfo(HubName = "flights")]SignalRConnectionInfo connectionInfo)
{
return (ActionResult)new OkObjectResult(connectionInfo);
}
现在,协商功能正在按预期工作。 希望对有类似问题的人有所帮助!
协商函数的示例输出负载
{"url":"https://myazuresignalrservice.service.signalr.net/client/?hub=myhubname","accessToken":"mybeareraccesstoken"}
更新
问题在于方法签名中的 *[SignalRConnectionInfo(HubName = "fruits")]SignalRConnectionInfo*
,而不是使用。
public static IActionResult Run(HttpRequest req, ILogger log, [SignalRConnectionInfo(HubName = "fruits")]SignalRConnectionInfo connectionInfo) { }
预期的有效负载也已发布,供您参考。如果您有任何问题,请在评论中告诉我。
我已经使用 extensions.csproj 安装了 Microsoft.Azure.WebJobs.Extensions.SignalRService。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<WarningsAsErrors />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDB" Version="3.0.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.0.*" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.SignalRService" Version="1.0.0" />
</ItemGroup>
</Project>
我能够 post 使用以下 Azure 函数通过 Azure SignalR 服务发送消息。当 CosmosDB 集合中有任何 AddOrUpdate() 操作时会触发函数,它会在集线器中通过名称 'fruitUpdated' 发送信号。
#r "Microsoft.Azure.DocumentDB.Core"
#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
public static void Run(IReadOnlyList<Document> input, ILogger log, ICollector<SignalRMessage> signalRMessages)
{
if (input != null && input.Count > 0)
{
log.LogInformation("Documents modified " + input.Count);
foreach (var fruit in input)
{
signalRMessages.Add(
new SignalRMessage
{
Target = "fruitUpdated",
Arguments = new [] { fruit }
});
}
}
}
但是协商功能现在好像不能用了。它在没有任何线索的情况下抛出 500 错误代码。以下是示例,
run.csx
#r "Newtonsoft.Json"
using System;
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
public static IActionResult Run(HttpRequest req, ILogger log, object connectionInfo)
{
return (ActionResult)new OkObjectResult(connectionInfo);
}
function.json
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"methods": [
"get",
"post"
]
},
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "flights",
"direction": "in",
"connectionStringSetting": "AzureSignalRConnectionString"
}
]
}
我尝试了所有组合。 Azure 文档在某些情况下令人厌烦!没有输入\输出模式它应该是不受欢迎的。 Azure 产品团队应该认真对待它
SignalR 版本彼此不兼容。如果我们在服务器和客户端中使用不同版本的 SignalR dll,它们只是被动地关闭消息而不会抛出错误。
我想我需要 JSON connectionInfo 对象的负载。你能帮我一下吗?
我在 Serverless360 找到了答案。结果是类型问题和方法参数修饰。在引用了 SignalService 库和装饰器之后,它开始工作了。在我看来,object
是一个基本类型,它应该已经收到或注入了 connectionInfo。
#r "Newtonsoft.Json"
#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
using System;
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
public static IActionResult Run(HttpRequest req, ILogger log, [SignalRConnectionInfo(HubName = "flights")]SignalRConnectionInfo connectionInfo)
{
return (ActionResult)new OkObjectResult(connectionInfo);
}
现在,协商功能正在按预期工作。 希望对有类似问题的人有所帮助!
协商函数的示例输出负载
{"url":"https://myazuresignalrservice.service.signalr.net/client/?hub=myhubname","accessToken":"mybeareraccesstoken"}
更新
问题在于方法签名中的 *[SignalRConnectionInfo(HubName = "fruits")]SignalRConnectionInfo*
,而不是使用。
public static IActionResult Run(HttpRequest req, ILogger log, [SignalRConnectionInfo(HubName = "fruits")]SignalRConnectionInfo connectionInfo) { }
预期的有效负载也已发布,供您参考。如果您有任何问题,请在评论中告诉我。