HttpWebRequest 时不时出现(401) 未经授权问题

向着有光的地方前进 2020-02-03 10:24:25
已经设置了Headers 但是有时候还是会出现401错误。
账户没有问题。频率时高时低
试过设置
request.Credentials = CredentialCache.DefaultCredentials;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";

认证:
// 添加https
if (EndPoint.Substring(0, 8) == "https://")
{
//设置证书接受状态
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
}

//证书设置
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}

接口是Rest API

//设置安全协议 Tls:192 Tls11:768 Tls12:3072
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;

var request = (HttpWebRequest)WebRequest.Create(EndPoint + parameters);


request.Method = Method.ToString();
request.ContentLength = 0;
request.ContentType = ContentType;
request.Headers.Add("Authorization", strAuthorization);


if (!string.IsNullOrEmpty(PostData) && Method == HttpVerbNew.POST)//如果传送的数据不为空,并且方法是post
{
var bytes = Encoding.GetEncoding("UTF-8").GetBytes(PostData);//编码方式按自己需求进行更改,我在项目中使用的是UTF-8
request.ContentLength = bytes.Length;


using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}


if (!string.IsNullOrEmpty(PostData) && Method == HttpVerbNew.PUT)//如果传送的数据不为空,并且方法是put
{
var bytes = Encoding.GetEncoding("UTF-8").GetBytes(PostData);//编码方式按自己需求进行更改,我在项目中使用的是UTF-8
request.ContentLength = bytes.Length;


using (var writeStream = request.GetRequestStream())
{
writeStream.Write(bytes, 0, bytes.Length);
}
}
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseValue = string.Empty;


if (response.StatusCode != HttpStatusCode.OK)
{
var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}


// 返回结果
using (var responseStream = response.GetResponseStream())
{
if (responseStream != null)
using (var reader = new StreamReader(responseStream))
{
responseValue = reader.ReadToEnd();
}
}


return responseValue;
...全文
815 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐吉坷德豆腐 2020-11-26
  • 打赏
  • 举报
回复
我们也遇到这个问题了,请问如何解决的
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
一般不自己拼接Authorization的具体字符串。 原因是当服务器401进行授权挑战时,可以使用不同的方案,以及不同的参数。 比如方案就有Basic/Digest/Negotiate等等。即使你用同一批用户名密码,不同的方案/参数下,Authorization的字符串结果是不一样的。 通常的方法是设置request .Credentials,让HttpWebRequest去自适应。
老哥,授权使用的是Basic64的加密(“Basic base64.encode(account:pwd)"),使用postman却没有出现该问题。 而且在测试环境中调用并没有出现过401的错误,在正式环境使用时出现的这个问题
github_36000833 2020-02-04
  • 打赏
  • 举报
回复
一般不自己拼接Authorization的具体字符串。 原因是当服务器401进行授权挑战时,可以使用不同的方案,以及不同的参数。 比如方案就有Basic/Digest/Negotiate等等。即使你用同一批用户名密码,不同的方案/参数下,Authorization的字符串结果是不一样的。 通常的方法是设置request .Credentials,让HttpWebRequest去自适应。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧