API管理URL出现缺少订阅密钥问题

24
我对API管理还不熟悉。我已经创建了一个基本的WEB API并将其托管到API应用程序(App Service)。URL按预期工作并返回数据,即http://xyz.azurewebsites.net/api/webapi
但是,当我将API应用程序添加到API管理中时,我得到了不同的URL,并添加了额外的后缀。但是,当我尝试在浏览器中打开链接--> https://abc.azure-api.net/God时,会出现以下错误: {"statusCode": 401, "message": "由于缺少订阅密钥而拒绝访问。确保在向API发出请求时包括订阅密钥。"} 如果API APP没有问题,那么API管理也不应该有问题。如果我漏掉了什么,请指导我。
注意:我已经尝试在fiddler中添加订阅密钥,但会出现不同的问题。但是,访问URL基本上不需要订阅密钥。

一种解决方法:在产品设置中禁用订阅密钥 - Azure Api管理是否可以禁用订阅密钥 - RBT
如果想知道要在请求标头中传递到API的订阅密钥,请查看此链接 - 在Windows Azure中查找我的Ocp-Apim-Subscription-Key的位置 - RBT
3个回答

26
如果您启用了产品设置的“要求订阅”选项,则必须传递以下标题:Ocp-Apim-Subscription-Key。 即使您提供订阅密钥,该密钥也必须属于包含API的产品。 如果您不想使用订阅选项,请在产品设置中禁用它。

但是尽管我已经从无限产品中提供了正确的订阅(因为我已经将API创建为无限),仍然遇到了相同的问题。删除该选项是解决方案,但在实际应用中如何处理呢? - lokanath das
您应该为您的API提供订阅密钥,这是一种身份验证措施。当您提供订阅密钥时,您遇到了什么错误? - VinuBibin
{"statusCode": 401, "message": "由于缺少订阅密钥,访问被拒绝。在向API发出请求时,请确保包含订阅密钥。"} 当我试图在浏览器中打开时,也会出现此错误。 - lokanath das
当直接在浏览器中打开时,您无法添加头部选项。因此会出现错误。如果您添加标题并从 Postman 中调用,则将完美运作! - VinuBibin
如果您想在打开浏览器时传递标题,请查看此链接:https://stackoverflow.com/questions/19021226/programmatically-pass-additional-header-info-along-with-url-to-open-a-browser - VinuBibin

6
如果您启用了产品设置中“要求订阅”的选项,则必须传递以下标题Ocp-Apim-Subscription-Key。即使您提供订阅密钥,该密钥也应属于API包含的产品。将您的API添加到产品中。
以下是操作步骤:
1.从Azure门户选择“产品”菜单/链接。 2.从列表中选择产品。 3.从所选产品选项中选择API。 4.单击“添加”按钮,从列表中选择您的API,然后单击“选择”。
现在您可以使用Postman或您的代码来使用API。 您需要在标题键(Ocp-Apim-Subscription-Key)中传递订阅密钥。
您可以在API开发人员门户的个人资料屏幕上找到订阅密钥(主/辅)。

4

您需要在请求标头中传递您的订阅密钥。

将以下代码添加到您的C#代码中:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add("Authorization", BearerToken);

 request.Headers.Add("Ocp-Apim-Subscription-Key", config["OcpApimSubscriptionKey"]);

请将以下内容添加到您的应用程序设置文件中:
"OcpApimSubscriptionKey": "your key",

示例代码:

 try
            {

                using (HttpClient client = new HttpClient())
                {
                    client.BaseAddress = new Uri(url);
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    client.DefaultRequestHeaders.Add("Authorization", BearerToken);
                    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", config["OcpApimSubscriptionKey"]);
                    HttpResponseMessage response = client.GetAsync(url).Result;
                    if (response.IsSuccessStatusCode)
                    {
                        return response.Content.ReadAsStringAsync().Result;
                    }
                    else
                    {
                        var ResponseResult = await response.Content.ReadAsStringAsync();
                        return ResponseResult;
                    }
                }
            }

            catch (WebException ex)
            {
                WebResponse errorResponse = ex.Response;
                using (Stream responseStream = errorResponse.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
                    string errorText = reader.ReadToEnd();
                }
                throw;
            }
            catch (ArgumentNullException ex)
            {
                throw;
            }
            catch (InvalidOperationException ex)
            {
                throw;
            }
            catch (HttpRequestException ex)
            {
                throw;
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接