【问题标题】:SignalR When calling connection.StartAsync() from Blazor WASM client Error 500 Patterns.RoutePatternExceptionSignalR 从 Blazor WASM 客户端调用 connection.StartAsync() 时出现错误 500 Patterns.RoutePatternException
【发布时间】:2021-01-02 19:51:37
【问题描述】:

我在服务器端收到错误 5000,出现 Patterns.RoutePatternException 和消息:

Microsoft.AspNetCore.Routing.Patterns.RoutePatternException:路由模板中的参数不完整。检查每个'{' 字符有一个匹配的 '}' 字符。

我在服务器端收到以下异常;

09/15/2020 21:06:17 -05:00 错误发生未处理的异常 在执行请求时。 Microsoft.AspNetCore.Routing.Patterns.RoutePatternException:路由模板中的参数不完整。检查每个'{' 字符具有匹配的 '}' 字符。在 Microsoft.AspNetCore.Routing.Patterns.RoutePatternParser.Parse(字符串 模式)在 Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Parse(字符串 模式)在 Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory.AddEndpoints(List1 endpoints, HashSet1 routeNames, ActionDescriptor action, IReadOnlyList1 routes, IReadOnlyList1 约定,布尔值 createInertEndpoints) 在 Microsoft.AspNetCore.Mvc.Routing.ControllerActionEndpointDataSource.CreateEndpoints(IReadOnlyList1 actions, IReadOnlyList1 约定) 在 Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.UpdateEndpoints() 在 Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.Initialize()

这是我使用 Blazor/Core ASP 3.1 的第二个应用程序,我尝试复制第一个工作的应用程序。在客户端,代码到达 StartAsync()

  Log.Warning("top of start service");
  connection = new HubConnectionBuilder()
      .WithUrl(url)
      .Build();

  Log.Warning("after connect in start service");
  connection.Closed += async (error) =>
  {
    await Task.Delay(new Random().Next(0, 5) * 1000);
    await connection.StartAsync();
  };
  connection.Reconnecting += error =>
  {
    Log.Error("Connection Lost attempting to reconnect: {@error}", error);

    // Notify users the connection was lost and the client is reconnecting.
    // Start queuing or dropping messages.

    return Task.CompletedTask;
  };
  try
  {
    Log.Warning("before start async");
    await connection.StartAsync();
    Log.Warning("after start async");

程序.cs

  var config = new ConfigurationBuilder()
      .AddJsonFile("appsettings.json")
      .Build();

  Log.Logger = new LoggerConfiguration()
      .ReadFrom.Configuration(config)
      .CreateLogger();

  try
  {

    CommandLine.Parser.Default.ParseArguments<Options>(args)
      .WithParsed(RunOptions)
      .WithNotParsed(HandleParseError);

    BuildWebHost(args).Build().Run();
  }
  catch (Exception e)
  {
    Console.WriteLine(e.Message);
  }
}

public static IHostBuilder BuildWebHost(string[] args) =>

    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
          webBuilder.UseStartup<Startup>();
          _ = webBuilder.UseUrls("http://*:8080");
        }).UseSerilog();

Startup.cs

  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddCors(o => o.AddPolicy("CorsPolicy", builder =>
      {
        builder
        //.WithOrigins("http://localhost:44322")
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowAnyOrigin();
      }));

      services.AddSignalR();

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment())
      {
        //app.UseStatusCodePagesWithReExecute("/Error");
        app.UseDeveloperExceptionPage();
      }
      else
      {
        app.UseStatusCodePagesWithReExecute("/Error");
        //app.UseHsts();
      }
      app.UseCors("CorsPolicy");
      app.UseDefaultFiles();
      app.UseStaticFiles();
      app.UseRouting();


      //var hubConfiguration = new HubConfiguration();


      app.UseEndpoints(endpoints =>
      {
        endpoints.MapHub<ShowsHub.BlazingShowsHub>("/shows");

        endpoints.MapDefaultControllerRoute();
      });

    }

建议?

【问题讨论】:

  • 您的路线模板一定有问题。请检查您的路线模板,例如 [Route("api/users/{userId/login")] 缺少 }
  • 这应该是一个答案,所以我可以投票并将其标记为已解决。我从来没有想过它在控制器中,因为我没有使用控制器。谢谢!

标签: asp.net-core asp.net-core-signalr blazor-webassembly


【解决方案1】:

Microsoft.AspNetCore.Routing.Patterns.RoutePatternException:有 路由模板中的参数不完整。检查每个'{' 字符有一个匹配的 '}' 字符。

从你发的RoutePatternException可以看出,肯定是控制器的路由模板有问题。请检查您的路线模板,例如 [Route("api/users/{userId/login")] 缺少 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2021-02-27
    • 2021-04-05
    • 2020-05-17
    • 2023-04-04
    相关资源
    最近更新 更多