无法分配请求的地址(Cannot assign requested address)的解决方案

71 篇文章 1 订阅
15 篇文章 2 订阅

搜索错误关键字“Cannot assign requested address”,"返回" JSON 内容,返回的引号是因为其实并不是远程接口返回的,而是 IdentityModel 返回的,毕竟直译后从字面意思理解“无法分配请求的地址”,也可以理解为不能正确发起请求,所以就是在发起请求的过程中产生的错误。

在和运维一起排查后得知被调用服务出现很多 close wait,导致连接数不能及时释放,连接数耗尽,所以就不能再建立新请求了。知道了原因接下来就好办了。顺藤摸瓜,找到发起请求的地方,将能 Close Dispose 的都处理了。

错误返回的完整内容如下:

{
	"AccessToken": null,
	"IdentityToken": null,
	"TokenType": null,
	"RefreshToken": null,
	"ErrorDescription": null,
	"ExpiresIn": 0,
	"Raw": null,
	"Json": null,
	"Exception": {
		"Message": "Cannot assign requested address",
		"Data": {},
		"InnerException": {
			"ClassName": "System.Net.Sockets.SocketException",
			"Message": "Cannot assign requested address",
			"Data": null,
			"InnerException": null,
			"HelpURL": null,
			"StackTraceString": "at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)",
			"RemoteStackTraceString": null,
			"RemoteStackIndex": 0,
			"ExceptionMethod": null,
			"HResult": -2147467259,
			"Source": "System.Private.CoreLib",
			"WatsonBuckets": null,
			"NativeErrorCode": 99
		},
		"StackTrace": "at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)\n   at System.Threading.Tasks.ValueTask`1.get_Result()\n   at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n   at System.Threading.Tasks.ValueTask`1.get_Result()\n   at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask)\n   at System.Threading.Tasks.ValueTask`1.get_Result()\n   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)\n   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)\n   at IdentityModel.Client.TokenClient.RequestAsync(IDictionary`2 form, CancellationToken cancellationToken)",
		"HelpLink": null,
		"Source": "System.Net.Http",
		"HResult": -2147467259
	},
	"IsError": true,
	"ErrorType": 3,
	"HttpStatusCode": 0,
	"HttpErrorReason": null,
	"Error": "Cannot assign requested address"
}

修改前源代码

/// <summary>
/// 统一获取 SpiderBIM token的通用方法
/// </summary>
/// <param name="config">配置信息</param>
/// <returns></returns>
public static TokenResponse GetAuthorizeAsync(SpiderBIMConfigOptions config)
{
    var tokenClient = new TokenClient(config.TokenUrl, config.ClientId, config.ClientSecret);
    var tokenResponse = tokenClient.RequestResourceOwnerPasswordAsync(config.Username, config.Password, config.Scope).GetAwaiter().GetResult();
    if (tokenResponse.IsError)
    {
        Console.WriteLine($"DEBUG {DateTime.Now:yyyy-MM-dd HH:mm:ss,fff} - ---------------------------- 获取 SPDToken 失败 ----------------------------{tokenResponse.ToJsonString()}");
        return null;
    }
    return tokenResponse;
}

修改后的代码

/// <summary>
/// 统一获取 SpiderBIM token的通用方法
/// </summary>
/// <param name="config">配置信息</param>
/// <returns></returns>
public static TokenResponse GetAuthorizeAsync(SpiderBIMConfigOptions config)
{
    using (var tokenClient = new TokenClient(config.TokenUrl, config.ClientId, config.ClientSecret))
    {
        var tokenResponse = tokenClient.RequestResourceOwnerPasswordAsync(config.Username, config.Password, config.Scope).GetAwaiter().GetResult();
        if (tokenResponse.IsError)
        {
            Console.WriteLine($"DEBUG {DateTime.Now:yyyy-MM-dd HH:mm:ss,fff} - ---------------------------- 获取 SPDToken 失败 ----------------------------{tokenResponse.ToJsonString()}");
            return null;
        }
        return tokenResponse;
    }
}

修改后的代码加上了 using 是的 tokenClient 在使用后及时被释放,避免被调用服务出现太多的 close wait。从而导致连接数被占用完。

所以就是因为没有注意到 tokenClient 是可以被 Dispose 的类,并且因为业务关系发起了频繁的请求,所以才导致问题的产生。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"cannot assign requested address"是一个错误信息,它通常出现在网络编程中。这个错误表示尝试将一个socket绑定到一个无效的地址上。引用和引用提到了在TCP服务和编程中可能出现该错误的情况。在这些场景中,当尝试将一个socket绑定到一个无效的地址时,操作系统会返回这个错误。这可能是由于地址无效、端口已被占用或者其他网络配置问题引起的。 在引用中提到了一个与Tomcat相关的错误信息,即"Cannot assign requested address: JVM_Bind"。这个错误通常发生在Tomcat服务器启动时,表示Tomcat无法将其服务绑定到请求地址上。这可能是由于端口已被占用或者网络配置不正确引起的。 综上所述,"cannot assign requested address"是一个通用的错误信息,它可能出现在不同的网络编程场景中,表示尝试将socket绑定到无效的地址上。具体的原因可能是地址无效、端口已被占用或者其他网络配置问题。对于具体的错误,需要根据上下文和具体的场景进行排查和解决。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [cannot assign requested address错误解决](https://blog.csdn.net/skh2015java/article/details/104467217)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Cannot assign requested address错误解决](https://blog.csdn.net/m0_46392035/article/details/124767886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Tomcat Cannot assign requested address: JVM_Bind 非端口占用冲突](https://download.csdn.net/download/weixin_38691703/12787735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值