You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:43:16