Response status code does not indicate success: 401 (Unauthorized).

本文详细介绍了在使用ASP.NET5调用IBMBluemix上的RESTAPI服务时遇到的401 Unauthorized异常问题,并提供了通过设置HttpClient的DefaultRequestHeaders.Authorization属性解决该问题的方法。通过将服务凭证转换为Base64编码格式并将其添加到HTTP请求头中,可以有效避免认证失败的情况。

在使用ASP.NET5调用IBM Bluemix上的REST API服务时出现此异常;

Response status code does not indicate success: 401 (Unauthorized).  
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at dotnethelloworld.Controllers.ValuesController.<Get>d__1.MoveNext()

相关代码:

        // GET api/values/txt
        [HttpGet("{txt}")]
        public async Task<string> Get(string txt)
        {
            String retString = txt;
            try
            {
                //构造url,source为要翻译文本的语言,target指定要翻译为什么语言
                String uri = "https://gateway.watsonplatform.net/language-translation/api/v2/translate?";
                uri += "source=en&target=es&text=" + txt;

                System.Net.Http.HttpClientHandler handler = new System.Net.Http.HttpClientHandler();
                NetworkCredential myCred = new NetworkCredential("用户名", "密码", "gateway.watsonplatform.net");
                CredentialCache myCache = new CredentialCache();
                myCache.Add(new Uri(uri), "Basic", myCred);
                handler.Credentials = myCache;
                System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient(handler);
                
                retString = await httpClient.GetStringAsync(uri);
                return "{\"text\":\"" + retString + "\"}";
            }
            catch (Exception ex)
            {
                return ex.Message;
                //throw ex;
            }
        }

MSDN中关于NetworkCredential 类的使用示例:

NetworkCredential myCred = new NetworkCredential(
	SecurelyStoredUserName,SecurelyStoredPassword,SecurelyStoredDomain);

CredentialCache myCache = new CredentialCache();

myCache.Add(new Uri("www.contoso.com"), "Basic", myCred);
myCache.Add(new Uri("app.contoso.com"), "Basic", myCred);

WebRequest wr = WebRequest.Create("www.contoso.com");
wr.Credentials = myCache;
只是它是用的WebRequest,而我是用的HttpClient,却不生效,没有找到具体原因;但可以通过另一种方法来解决用户验证的问题。

解决方法:

设置httpClient.DefaultRequestHeaders.Authorization 属性,代码如下:

System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
//将服务凭证转换为Base64编码格式
byte[] auth = Encoding.UTF8.GetBytes("用户名:密码");
String auth64 = Convert.ToBase64String(auth);
//创建并指定服务凭证,认证方案为Basic
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", auth64);

retString = await httpClient.GetStringAsync(uri);

Request URI: /dbs, RequestStats: Microsoft.Azure.Cosmos.Tracing.TraceData.ClientSideRequestStatisticsTraceDatum, SDK: Windows/10.0.20348 cosmos-netstandard-sdk/3.18.0);, full error: {'ok': 0.0, 'errmsg': 'Error=13, Details=\'Response status code does not indicate success: Forbidden (403); Substatus: 0; ActivityId: 8139f2d1-8bbe-46e3-9a84-71d66f0bcc3b; Reason: ({"code":"Forbidden","message":"\\"Operation \'POST\' on resource \'dbs\' is not allowed through Azure Cosmos DB endpoint. Please switch on such operations for your account, or perform this operation through Azure Resource Manager, Azure Portal, Azure CLI or Azure Powershell\\"\\r\\nActivityId: 8139f2d1-8bbe-46e3-9a84-71d66f0bcc3b, Microsoft.Azure.Documents.Common/2.14.0"}\r\nRequestUri: https://tsc-01-cosmos-mango-cnn3-prod-chinanorth3.documents.azure.cn/dbs;\r\nRequestMethod: POST;\r\nHeader: Authorization Length: 82;\r\nHeader: x-ms-date Length: 29;\r\nHeader: x-ms-cosmos-sdk-supportedcapabilities Length: 1;\r\nHeader: x-ms-activity-id Length: 36;\r\nHeader: Cache-Control Length: 8;\r\nHeader: User-Agent Length: 147;\r\nHeader: x-ms-cosmos-apitype Length: 7;\r\nHeader: x-ms-version Length: 10;\r\nHeader: Accept Length: 16;\r\nHeader: x-ms-gateway-signature Length: 92;\r\nHeader: x-ms-cosmos-compute-hop-count Length: 1;\r\nHeader: x-ms-gateway-use-mtls Length: 1;\r\nHeader: traceparent Length: 55;\r\n, Request URI: /dbs, RequestStats: Microsoft.Azure.Cosmos.Tracing.TraceData.ClientSideRequestStatisticsTraceDatum, SDK: Windows/10.0.20348 cosmos-netstandard-sdk/3.18.0);', 'code': 13, 'codeName': 'Unauthorized'}
06-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值