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

在C#控制台应用中使用HttpWebRequest调用外部API时遭遇401未授权错误,求Basic Authentication认证方案

解决HttpWebRequest 401 Unauthorized的Basic认证问题

我一眼就看到你代码里的Basic认证配置有问题,这是很多人刚用HttpWebRequest时会踩的坑!咱们一步步来修复:

核心错误点:Authorization头格式错误

你当前的代码里写的是:

request.Headers["Authorization"] = "Basic Auth" + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(userName + ":" + password));

这完全不符合Basic认证的标准格式!正确的格式应该是 Basic [Base64编码的用户名:密码],注意**"Basic"后面必须跟一个空格**,而不是你写的"Basic Auth"。

修正后的认证实现方式

我给你两种可靠的实现方式,你可以选一种用:

方式1:手动正确设置Authorization头

直接修正头的格式,同时注意编码(标准要求用ISO-8859-1,不过大多数API也支持UTF8):

// 修正Authorization头格式
var authCredentials = $"{userName}:{password}";
var encodedAuth = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authCredentials));
request.Headers["Authorization"] = $"Basic {encodedAuth}"; // 这里的空格必须有!

方式2:使用CredentialCache(更推荐,避免手动拼接错误)

HttpWebRequest本身支持通过CredentialCache来设置Basic认证,这种方式更规范,也不容易出错:

var credentialCache = new CredentialCache();
credentialCache.Add(
    new Uri(serviceUrl), 
    "Basic", 
    new NetworkCredential(userName, password)
);
request.Credentials = credentialCache;
// 注意:用这种方式的话,就不需要手动设置Authorization头了,框架会自动处理

额外检查点

除了认证格式,还有几个地方你也需要确认:

  • 你的用户名里包含双引号(prefix = @"abc"""),要确认API端是否接受带特殊字符的用户名,必要时可以先在Postman里测试这个认证信息是否有效
  • 自定义头User-Id和User-Type的值是否符合API的要求,有些API对这些头的格式或取值有严格限制
  • 异常处理里不要空着,至少要记录异常信息(比如Console.WriteLine(ex.ToString())),这样能更快排查其他潜在问题

完整修正后的代码示例

这里是整合了方式1的完整代码,标注了修改的部分:

public string InvokeRestService() {
    var serviceUrl = "http://xrmd0/api/v1.0/student/specialized/feed";
    var reqData = _service.Retrieve("entityname", new Guid("guid"), new ColumnSet("requestdata"));
    var requestBody = reqData.Attributes["requestdata"].ToString();
    string prefix = @"abc""";
    string userName = prefix + "xyz";
    string password = "pwdqawe";
    try {
        var request = (HttpWebRequest)WebRequest.Create(new Uri(serviceUrl));
        request.Method = "POST";
        request.ContentType = "application/json";
        request.Accept = "application/json";
        
        // --- 修正的认证代码开始 ---
        var authCredentials = $"{userName}:{password}";
        var encodedAuth = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authCredentials));
        request.Headers["Authorization"] = $"Basic {encodedAuth}";
        // --- 修正的认证代码结束 ---
        
        request.Headers["User-Id"] = "userId";
        request.Headers["User-Type"] = "usertype";
        
        if (!string.IsNullOrEmpty(requestBody)) {
            byte[] data = Encoding.UTF8.GetBytes(requestBody);
            using (var requestStream = request.GetRequestStream()) { // 推荐用using自动释放资源
                requestStream.Write(data, 0, data.Length);
            }
        }
        
        using (var response = (HttpWebResponse)request.GetResponse())
        using (var responseStream = response.GetResponseStream())
        using (var responseStreamReader = new StreamReader(responseStream, Encoding.UTF8)) {
            var responseString = responseStreamReader.ReadToEnd();
            return responseString;
        }
    } catch (Exception ex) {
        // 一定要记录异常信息,方便排查
        Console.WriteLine($"调用API出错:{ex.Message}\n{ex.StackTrace}");
        return null; // 或者抛出异常,根据你的业务需求处理
    }
}

最后建议

在修改代码前,先在Postman里测试一下API调用:输入相同的URL、请求体、认证信息和自定义头,确认能正常返回数据。如果Postman里也报错,那问题可能在API端或者你的认证信息本身;如果Postman正常,那再回到代码里排查细节。

内容的提问来源于stack exchange,提问作者manoj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:54:05