gpt4 book ai didi

azure - Blazor Server SignalR Chat 适用于本地,不适用于 Azure

转载 作者:行者123 更新时间:2023-12-03 03:39:57 26 4
gpt4 key购买 nike

我有一个正在运行的 Blazor Server 应用程序,其中的聊天组件使用信号 R 集线器连接在本地正确运行。

部署到 Azure 时,我收到错误“收到无效协商响应”。---> System.Text.Json.JsonReaderException:“0x1F”是值的无效开头。

这里有一个类似的链接票证,但从未得到答复:Blazor Server SignalR hub fails on StartAsync due to Azure ADB2C

目标:为 Blazor 服务器应用程序创建私有(private)聊天功能。我无法使用单例服务,因为所有用户无法共享该服务的同一实例。

我还没有找到 blazor 服务器中的用户/用户组之间具有消息传递功能的示例。

由于我使用 Azure B2C 身份验证和 OIDC 默认身份验证方案,因此我必须手动传递 cookie 和 header 。

就像我提到的,这个示例在本地主机上运行得很好,当我打开两个浏览器(一个在隐身模式下)时,我能够在登录的用户之间发送消息。但是,当我发布到 Azure 应用服务时,我无法连接到中心。

代码:

private HubConnection _hubConnection;
private User user;
ObservableCollection<Message> messages = new ObservableCollection<Message>();
SfTextBox MessageBox;
SfTextBox SendTo;

public class Message
{
public string Id { get; set; }
public string UserName { get; set; }
public string MessageText { get; set; }
public string Chat { get; set; }
}

protected override async Task OnInitializedAsync()
{
var state = await authenticationStateProvider.GetAuthenticationStateAsync();
user = state.ToUser();
_hubConnection = new HubConnectionBuilder()
.WithUrl(navigationManager.ToAbsoluteUri("/chatHub"), options =>
{
options.UseDefaultCredentials = true;
var httpContext = HttpContextAccessor.HttpContext;
var cookieCount = httpContext.Request.Cookies.Count();
var cookieContainer = new System.Net.CookieContainer(cookieCount);
foreach (var cookie in httpContext.Request.Cookies)
cookieContainer.Add(new System.Net.Cookie(
cookie.Key,
WebUtility.UrlEncode(cookie.Value),
path: httpContext.Request.Path,
domain: httpContext.Request.Host.Host));
options.Cookies = cookieContainer;

NameValueHeaderValue headers = null;
foreach (var header in httpContext.Request.Headers)
{
if (header.Key != ":method")
options.Headers.Add(header.Key, header.Value);
}
options.HttpMessageHandlerFactory = (input) =>
{
var clientHandler = new HttpClientHandler
{
PreAuthenticate = true,
CookieContainer = cookieContainer,
UseCookies = true,
UseDefaultCredentials = true,
};

return clientHandler;
};
})
.WithAutomaticReconnect()
.Build();

_hubConnection.On<string, string, string, string>("ReceiveMessage", (userName, from, to, message) =>
{
if (user.Email == to || user.Id == from)
{
messages.Add(new Message()
{
Id = Guid.NewGuid().ToString(),
MessageText = message,
Chat = user.Id == from ? "sender" : "receive",
UserName = user.Id == from ? "You" : userName
});
StateHasChanged();
}
});

await _hubConnection.StartAsync();
}

public async void Send()
{
if (MessageBox.Value != "" && SendTo.Value != "")
{
var userName = user.DisplayName;
var to = SendTo.Value;
var message = MessageBox.Value;
var from = user.Id;
_hubConnection.SendAsync("SendMessage", userName, from, to, message);
}
}

public bool IsConnected => _hubConnection.State == HubConnectionState.Connected;

}

最佳答案

问题在于 Azure 平台上的身份验证。由于您以前手动提供cookie,因此在本地工作正常,而当涉及到Azure平台时,我们需要提供身份验证。

请点击以下链接获取支持。

https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-invalid-json?pivots=dotnet-6-0

https://learn.microsoft.com/en-us/azure/azure-signalr/signalr-tutorial-build-blazor-server-chat-app

关于azure - Blazor Server SignalR Chat 适用于本地,不适用于 Azure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71686116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com