当前位置 博文首页 > 文章内容

    无法分配请求的地址(Cannot assign requested address)的解决方案:研究、探索、分享与成长

    作者:shunshunshun18 栏目:未分类 时间:2021-10-17 20:53:47

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    推荐 IIS7批量FTP管理工具 IIS7批量FTP管理
    IIS7批量FTP管理功能说明:
    1、可批量导入,导出FTP信息
    2、其他ftp工具有的功能,我们也有
    3、特色功能:可以定时上传下载
    4、数据信息列表化、一眼就能知道那个是那个
    5、批量连接 标签页式切换 方便快捷
    6、7大连接模式 更多好的兼容
    7、内嵌编辑器 有效解决普通txt记事本乱码
    8、锁屏功能 当程序有规定时间内没人操作,则自动锁程序。输入密码才可以正常操作

    本产品适用于:懒得记录FTP信息和有批量定时备份,上传下载的运维或站长。

    图:


    IIS7批量FTP管理

    搜索错误关键字“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 的类,并且因为业务关系发起了频繁的请求,所以才导致问题的产生。

    cs