【问题标题】:.net 5 - Signalr - Messagepack - lz4 - Error: unable to find ext type 98.net 5 - Signalr - Messagepack - lz4 - 错误:无法找到 ext 类型 98
【发布时间】:2020-12-01 09:19:47
【问题描述】:

在启用 lz4BlockArray 压缩后,使用 Angular 客户端在 .net core 5 解决方案中出现此错误。 没有压缩一切似乎都很好。 环顾四周寻找动力,但我一无所获。 好像有些解码器没有正确加载。

这是客户端错误,没有服务器端错误

Utils.js:208 [2020-12-01T09:01:42.527Z] Trace: (WebSockets transport) data received. Binary data of length 1086.
core.js:4352 ERROR Error: unable to find ext type 98
    at decodeExt (decoder.js:432)
    at tryDecode (decoder.js:266)
    at decodeArray (decoder.js:338)
    at tryDecode (decoder.js:288)
    at decodeArray (decoder.js:338)
    at tryDecode (decoder.js:288)
    at decodeArray (decoder.js:338)
    at tryDecode (decoder.js:288)
    at Object.decode (decoder.js:103)
    at MessagePackHubProtocol.push.jxpC.MessagePackHubProtocol.parseMessage (MessagePackHubProtocol.js:79)

复制

我的配置:

部分项目

<PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
    <TypeScriptToolsVersion>Latest</TypeScriptToolsVersion>
    <IsPackable>false</IsPackable>
    <SpaRoot>ClientApp\</SpaRoot>
    <DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>

    <BuildServerSideRenderer>false</BuildServerSideRenderer>
    <Configurations>Debug;Release;Development;DStaging;DProduction;Staging;Production</Configurations>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="HtmlSanitizer" Version="5.0.355" />
    <PackageReference Include="IdentityModel" Version="4.5.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="5.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="5.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="5.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.0" />
    <PackageReference Include="NLog.Targets.ElasticSearch" Version="7.5.0" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" />
  </ItemGroup>

Startup.cs

  var resolver = CompositeResolver.Create(
               DynamicEnumAsStringResolver.Instance,
               StandardResolver.Instance
           );
           services.AddSignalR().AddMessagePackProtocol(

               option =>
               {
                   option.SerializerOptions =
                       MessagePackSerializerOptions.Standard.WithResolver(resolver)
                           .WithCompression(MessagePackCompression.Lz4BlockArray)
                           .WithSecurity(MessagePackSecurity.UntrustedData);
               });

package.json

"@microsoft/signalr": "^5.0.0",
"@microsoft/signalr-protocol-msgpack": "^5.0.0",

连接

const builder = new HubConnectionBuilder();
      // as per setup in the startup.cs
      this._hubConnection = builder.withUrl('url', {
        accessTokenFactory:
          () => {
            const token = sessionStorage.getItem('token');
            return JSON.parse(token).access_token;
          },
      }).configureLogging(signalR.LogLevel.Trace).withAutomaticReconnect(new SignalrRetryPolicy()).withHubProtocol(new MessagePackHubProtocol()).build();

tsconfig

{
  "compileOnSave": true,
  "compilerOptions": {
    "baseUrl": "./",
    "downlevelIteration": true,
    "module": "es2020",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ]
  }
}

感谢您的帮助

【问题讨论】:

    标签: angular signalr msgpack .net-5 lz4


    【解决方案1】:

    来自.NET MessagePack libraries README

    MessagePackCompression 有两种模式,Lz4Block 和 Lz4BlockArray。两者都不是简单的二进制 LZ4 压缩,而是集成到序列化管道中的特殊压缩,使用 MessagePack ext 代码(Lz4BlockArray (98) 或 Lz4Block (99))。因此,它不容易与其他语言提供的压缩兼容。

    重要的部分是最后一句话,其他语言可能不兼容。在这种情况下,Angular 客户端使用的 MessagePack 库不支持这些 ext 代码进行压缩。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多