Windows服务器向Linux服务器传输含!的密码报错求助
解决含感叹号的Basic Auth密码传输问题
问题出在手动处理Basic认证编码的方式不符合HTTP规范,和Windows/Linux的转义规则无关。以下是两种解决方案:
方案1:使用RestSharp内置Basic认证器(推荐)
RestSharp提供了专门的HttpBasicAuthenticator,会自动遵循RFC 7617规范处理用户名和密码的编码,包括特殊字符,无需手动拼接和转码:
string Username = "myUserName"; string Password = "password123!"; var client = new RestClient("https://linuxserver/xml-data/data-producer-listdata"); // 配置内置Basic认证 client.Authenticator = new HttpBasicAuthenticator(Username, Password); var request = new RestRequest("", Method.Get); request.AddHeader("cache-control", "no-cache"); request.AddHeader("Connection", "keep-alive"); var response = client.Execute(request);
方案2:手动规范编码(不推荐)
如果必须手动处理认证头,需改用UTF-8编码(HTTP Basic Auth规范要求)而非ASCII编码,确保特殊字符被正确转换:
string Username = "myUserName"; string Password = "password123!"; string authenticationString = $"{Username}:{Password}"; // 用UTF-8编码替代ASCII byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(authenticationString); string base64EncodedAuthenticationString = Convert.ToBase64String(authBytes); var client = new RestClient("https://linuxserver/xml-data/data-producer-listdata"); var request = new RestRequest("", Method.Get); request.AddHeader("cache-control", "no-cache"); request.AddHeader("Authorization", "Basic " + base64EncodedAuthenticationString); request.AddHeader("Connection", "keep-alive"); var response = client.Execute(request);
为什么之前的方法失效?
HTTP Basic Auth规范要求将用户名密码拼接后用UTF-8编码再转Base64,而非ASCII。虽然!属于ASCII字符,但部分服务端会严格校验编码格式,手动用ASCII编码可能导致服务端解析失败,返回400错误。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

