来自 SignalR 的响应被中断?
Response from SignalR being interrupted?
我正在尝试为我的 Xamarin 应用设置 SignalR。好吧,它适用于小的纯字符串,所以总的来说,我认为我的设置还可以。但出于某种原因,这不适用于“更大”(400 个字符)序列化对象(使用 Newtonsoft JSON)。
这很奇怪:当我调试它时,我可以进入粗体(eww,两颗星)线......然后就......什么都没有发生 - 没有异常,没有日志。我只是无法进入斜体(...一颗星)行(并且日志中也没有创建其他行)。而且应用程序没有崩溃或其他任何问题。
好吧,我想这与时间有关,但在花了 4-5 个小时后,我不知道接下来要尝试什么。
private HubConnection HubConnection { get; set; }
/// setting up connection and subscribe
public async Task Initialize()
{
Log.Debug("Create connection to hub");
HubConnection = new HubConnectionBuilder()
.WithAutomaticReconnect()
.WithUrl($"{ServiceLocator.Defaults.BackendUrl}MainHub")
.Build();
HubConnection.On<string>("ResponseFromHub", DefaultHandler);
await HubConnection.StartAsync();
}
/// should handle incoming data
private async Task DefaultHandler(string requestContextString)
{
Log.Debug($"Response {requestContextString}");
// everything seems to work until the next line
**var requestContext = SerializationHelper.DeserializeObject<RequestContext>(requestContextString);**
*Log.Debug($"Response as object {requestContext}");*
await Task.FromResult(true);
}
/// send a request
public async Task Request(RequestContext rc)
{
if (HubConnection == null)
await Initialize();
var requestContextString = SerializationHelper.SerializeObject(rc);
Log.Debug($"Request: {rc}");
await HubConnection.InvokeAsync(
"RequestFromHub",
requestContextString
);
}
SerializationHelper 只是默认 Newtonsoft 函数的包装器,它只是设置选项(我使用了数千次):
public static T DeserializeObject<T>(string contentString, JsonSerializerSettings jsonSerializerSettings = null)
{
if (jsonSerializerSettings == null)
{
jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.TypeNameHandling = TypeNameHandling.All;
jsonSerializerSettings.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple;
jsonSerializerSettings.Converters = new List<JsonConverter> { new ObjectDeserializer(), new IntDeserializer(), new FloatDeserializer() };
}
return JsonConvert.DeserializeObject<T>(contentString, jsonSerializerSettings);
}
更新
似乎它与序列化程序有关。我能够使用 TypeNameHandling 的其他设置使其工作(当然不使用 TypeNameHandling.All)。但这并不能解决问题,因为我需要对象反序列化的类型信息。
我猜这是一些与线程相关的问题,线程被锁定了??
好的,我在调试器中更改默认异常处理后发现了问题:
https://docs.microsoft.com/de-de/azure/azure-signalr/signalr-howto-troubleshoot-guide
确实有异常,只是被消音了!
Could not load file or assembly 'System.Private.CoreLib
所以接下来的步骤就是找到解决方法。我正在使用 .NET Standard 和 .NET 5(“核心”)库。但那是另一个话题并且被讨论,例如这里:
我正在尝试为我的 Xamarin 应用设置 SignalR。好吧,它适用于小的纯字符串,所以总的来说,我认为我的设置还可以。但出于某种原因,这不适用于“更大”(400 个字符)序列化对象(使用 Newtonsoft JSON)。
这很奇怪:当我调试它时,我可以进入粗体(eww,两颗星)线......然后就......什么都没有发生 - 没有异常,没有日志。我只是无法进入斜体(...一颗星)行(并且日志中也没有创建其他行)。而且应用程序没有崩溃或其他任何问题。
好吧,我想这与时间有关,但在花了 4-5 个小时后,我不知道接下来要尝试什么。
private HubConnection HubConnection { get; set; }
/// setting up connection and subscribe
public async Task Initialize()
{
Log.Debug("Create connection to hub");
HubConnection = new HubConnectionBuilder()
.WithAutomaticReconnect()
.WithUrl($"{ServiceLocator.Defaults.BackendUrl}MainHub")
.Build();
HubConnection.On<string>("ResponseFromHub", DefaultHandler);
await HubConnection.StartAsync();
}
/// should handle incoming data
private async Task DefaultHandler(string requestContextString)
{
Log.Debug($"Response {requestContextString}");
// everything seems to work until the next line
**var requestContext = SerializationHelper.DeserializeObject<RequestContext>(requestContextString);**
*Log.Debug($"Response as object {requestContext}");*
await Task.FromResult(true);
}
/// send a request
public async Task Request(RequestContext rc)
{
if (HubConnection == null)
await Initialize();
var requestContextString = SerializationHelper.SerializeObject(rc);
Log.Debug($"Request: {rc}");
await HubConnection.InvokeAsync(
"RequestFromHub",
requestContextString
);
}
SerializationHelper 只是默认 Newtonsoft 函数的包装器,它只是设置选项(我使用了数千次):
public static T DeserializeObject<T>(string contentString, JsonSerializerSettings jsonSerializerSettings = null)
{
if (jsonSerializerSettings == null)
{
jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.TypeNameHandling = TypeNameHandling.All;
jsonSerializerSettings.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple;
jsonSerializerSettings.Converters = new List<JsonConverter> { new ObjectDeserializer(), new IntDeserializer(), new FloatDeserializer() };
}
return JsonConvert.DeserializeObject<T>(contentString, jsonSerializerSettings);
}
更新 似乎它与序列化程序有关。我能够使用 TypeNameHandling 的其他设置使其工作(当然不使用 TypeNameHandling.All)。但这并不能解决问题,因为我需要对象反序列化的类型信息。 我猜这是一些与线程相关的问题,线程被锁定了??
好的,我在调试器中更改默认异常处理后发现了问题: https://docs.microsoft.com/de-de/azure/azure-signalr/signalr-howto-troubleshoot-guide
确实有异常,只是被消音了!
Could not load file or assembly 'System.Private.CoreLib
所以接下来的步骤就是找到解决方法。我正在使用 .NET Standard 和 .NET 5(“核心”)库。但那是另一个话题并且被讨论,例如这里: