Azure多Web应用同时运行触发SocketException的解决方案咨询
问题描述
刚接触Azure门户及DevOps相关技术,近期在Azure中创建了生产环境的新App Service(Web应用),与UAT环境使用相同的App Service计划,已完成自定义域名注册等流程,且Web应用已成功关联DevOps代码仓库。
当生产与UAT Web应用同时运行时,出现如下异常:
Application: w3wp.exe CoreCLR Version: 8.0.524.21615 .NET Version: 8.0.5 Description: The process was terminated due to an unhandled exception. Exception Info: System.Net.Sockets.SocketException (10013): An attempt was made to access a socket in a way forbidden by its access permissions. at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, Boolean disconnectOnFailure, String callerName) at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at Orleans.Networking.Shared.SocketConnectionListener.Bind() in /_/src/Orleans.Core/Networking/Shared/SocketConnectionListener.cs:line 71 at Orleans.Networking.Shared.SocketConnectionListenerFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken) in /_/src/Orleans.Core/Networking/Shared/SocketConnectionListenerFactory.cs:line 41 at Orleans.Runtime.Messaging.ConnectionListener.BindAsync() in /_/src/Orleans.Runtime/Networking/ConnectionListener.cs:line 78 at Orleans.Runtime.SiloLifecycleSubject.MonitoredObserver.OnStart(CancellationToken ct) in /_/src/Orleans.Runtime/Lifecycle/SiloLifecycleSubject.cs:line 134 at Orleans.LifecycleSubject.OnStart(CancellationToken cancellationToken) in /_/src/Orleans.Core/Lifecycle/LifecycleSubject.cs:line 118 at Orleans.Runtime.Scheduler.AsyncClosureWorkItem.Execute() in /_/src/Orleans.Runtime/Scheduler/ClosureWorkItem.cs:line 33 at Orleans.Runtime.Silo.StartAsync(CancellationToken cancellationToken) in /_/src/Orleans.Runtime/Silo/Silo.cs:line 201 at Orleans.Hosting.SiloHostedService.StartAsync(CancellationToken cancellationToken) in /_/src/Orleans.Runtime/Hosting/SiloHostedService.cs:line 28 at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__15_1(IHostedService service, CancellationToken token) at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List1 exceptions, Func3 operation) at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>g__LogAndRethrow|15_3(<>&c__DisplayClass15_0&) ...
目前临时解决方案是停用生产Web应用,寻求可同时运行两个应用的永久解决办法。
解决方案
核心原因
同一个App Service计划下的多个Web应用共享服务器资源,你的应用依赖Orleans框架,默认配置下生产和UAT应用尝试绑定同一个端口,导致端口占用冲突,触发SocketException 10013。
1. 为每个环境配置独立的Orleans端口
这是最直接低成本的解决方式:
- 分别进入生产和UAT的App Service门户页面,找到配置 > 应用程序设置,添加以下两个应用设置:
- 生产环境:
ORLEANS_SILO_PORT=11111,ORLEANS_GATEWAY_PORT=30001 - UAT环境:
ORLEANS_SILO_PORT=11112,ORLEANS_GATEWAY_PORT=30002
(端口值可自定义,只要在Azure允许的1024-65535范围内,且两个环境不重复即可)
- 生产环境:
- 修改应用中Orleans的启动代码,读取这些环境变量来指定端口:
// 读取环境变量,未配置则用默认值 var siloPort = int.Parse(Environment.GetEnvironmentVariable("ORLEANS_SILO_PORT") ?? "11111"); var gatewayPort = int.Parse(Environment.GetEnvironmentVariable("ORLEANS_GATEWAY_PORT") ?? "30000"); var siloBuilder = new SiloHostBuilder() .UseLocalhostClustering(siloPort: siloPort, gatewayPort: gatewayPort) // 其他Orleans配置项... - 重新部署两个环境的应用,启动后即可避免端口冲突。
2. 使用独立的App Service计划(可选)
如果需要更彻底的环境隔离,将生产和UAT应用分别部署到不同的App Service计划中。这样两个应用运行在独立的服务器实例上,不会共享端口资源,从根源上避免冲突。不过这种方式会增加成本,适合对隔离性要求高的场景。
3. 验证端口可用性
确保你选择的端口未被Azure系统或其他服务占用。Azure App Service允许应用使用的端口范围是1024-65535,避开已知的系统预留端口(如80、443这些Web服务默认端口)即可。
内容的提问来源于stack exchange,提问作者Sebastian Van Rooyen
相关产品推荐
相关产品推荐

