基于Hamachi搭建.NET Core 3.1 SignalR服务器及替代方案咨询
问题描述
本人首次接触网络编程,使用C#、Visual Studio开发一款小型手游。因租赁服务器成本过高,且希望在贴近真实环境的条件下调试游戏,但网络服务商不允许端口映射,无法将本机作为公网服务器。尝试通过Hamachi局域网配置.NET Core 3.1 SignalR服务器,指定Hamachi IP后服务器可正常启动,但客户端无法连接。现咨询:
- 是否可通过Hamachi搭建该网络连接?
- 另有哪些可在本机运行服务器的替代方案?
附相关代码配置:
Startup.cs
using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.HttpsPolicy;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Options;using SignalRtest.Hubs;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks; namespace SignalRtest { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddSignalR(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } // app.UseCors("CorsPolicy"); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // app.MapHub<MyHubs>("/myhubs"); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapHub<myhubs>("/myhubs"); }); } } }
launchSettings.json
我们尝试指定本机及Hamachi网络IP,也试过不同端口。
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:52131", "sslPort": 44378 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "SignalRtest": { "commandName": "Project", "launchBrowser": true, "applicationUrl": "https://25.35.XXX.XX:12975;http://25.35.XXX.XX:32976", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
CLIENT
public void HUB_CONNECTED() { HubConnections = new HubConnectionBuilder() .WithUrl("https://25.35.XXX.XX:12975/myhubs") .WithAutomaticReconnect() .Build(); }
注:使用默认localhost地址(https://localhost:5001;http://localhost:5000)时可正常工作,需实现跨设备测试。
解答
一、Hamachi可以搭建该网络连接,连接失败大概率是以下问题导致:
CORS未配置:代码中注释掉了
app.UseCors("CorsPolicy"),跨设备连接时客户端会触发CORS校验,必须配置允许跨域请求。
修复步骤:- 在
ConfigureServices中添加CORS配置:services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => { builder.AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() .WithOrigins("*"); // 开发环境可先用*,生产环境指定具体客户端地址 }); }); - 在
Configure中启用CORS,放在UseRouting之前:app.UseCors("CorsPolicy");
- 在
HTTPS证书不被信任:使用HTTPS连接时,Hamachi环境下的自签名证书可能不被客户端认可。
修复方式:- 开发环境可暂时改用HTTP连接,将客户端的
WithUrl改为http://25.35.XXX.XX:32976/myhubs,确保服务器HTTP端口正常监听。 - 若必须用HTTPS,可在客户端添加证书忽略逻辑(仅开发环境使用):
.WithUrl("https://25.35.XXX.XX:12975/myhubs", options => { options.HttpMessageHandlerFactory = _ => new HttpClientHandler { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }; })
- 开发环境可暂时改用HTTP连接,将客户端的
防火墙拦截端口:本机防火墙可能阻止了Hamachi端口的入站请求,需在Windows防火墙中添加规则,允许12975和32976端口的TCP流量。
Hamachi网络状态异常:确保客户端设备和服务器设备都已加入同一Hamachi网络,且Hamachi客户端显示为绿色在线状态,能互相ping通对方的Hamachi IP。
二、本机运行服务器的替代方案
- 同一局域网热点共享:用电脑或手机开启热点,将服务器设备和测试设备连接到同一热点,直接使用服务器的局域网IP(如192.168.x.x)连接,适合近距离调试。
- 免费内网穿透工具:使用类似Ngrok的工具,将本机端口映射到公网地址,无需端口映射权限,客户端通过工具生成的公网URL连接服务器,适合跨地域调试。
- 其他虚拟局域网工具:ZeroTier、Tailscale等工具和Hamachi功能类似,免费额度足够小型开发调试使用,可更换工具排查兼容性问题。
- 云服务器免费试用:国内主流云服务商提供新用户免费试用云服务器,时长1个月到1年不等,可用来部署测试服务器,贴近真实公网环境。
内容的提问来源于stack exchange,提问作者Sky Keeper
相关产品推荐
相关产品推荐

