403从Azure App Service调用API

时间:2018-02-24 06:40:45

标签: azure .net-core azure-web-sites

我有一个奇怪的问题。我有一个.NET Core App,可以在本地机器上正常工作并通过单元测试。

在应用程序内部,它基本上称为我们的平台Web服务:

using( WebClient client = new WebClient() )
{
    NetworkCredential creds = new NetworkCredential(_userName, _password);
    CredentialCache credCache = new CredentialCache();
    credCache.Add(new System.Uri(_baseUrl), "Basic", creds);
    client.Credentials = credCache;

    var url = _baseUrl + "/api/v1/Pricing/Rates";
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json");    
    var request = JsonConvert.SerializeObject(data);
    System.Console.Out.WriteLine(request);      
    var response = client.UploadString(url, request);
    var responseObject = JObject.Parse(response);
    var products = responseObject["PricingProducts"].Children();

    var result = new Dictionary<string, double>();
    foreach( var product in products ) 
    {
        result.Add(product.Value<string>("LoanProgramName"), 
                   product.Value<double>("Rate"));
    }
    return result;
}

当我使用dotnet run在本地计算机上执行此操作时,一切正常。单元测试也很有效。除了我从平台Web服务获得403之外,App Service上的日志并没有告诉我什么。

ers.RatesController.Get (AlexaRates) with arguments ((null)) - ModelState is Valid
2018-02-24 06:37:44.418 +00:00 [Information] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Executed action AlexaRates.Controllers.RatesController.Get (AlexaRates) in 201.3483ms
2018-02-24 06:37:44.447 +00:00 [Error] Microsoft.AspNetCore.Server.Kestrel: Connection id "0HLBRA4B41EO8", Request id "0HLBRA4B41EO8:00000002": An unhandled exception was thrown by the application.
System.Net.WebException: The remote server returned an error: (403) Forbidden.
   at System.Net.HttpWebRequest.GetResponse()
   at System.Net.WebClient.GetWebResponse(WebRequest request)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream)
   at System.Net.WebClient.UploadBits(WebRequest request, Stream readStream, Byte[] buffer, Int32 chunkSize, Byte[] header, Byte[] footer)
   at System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request)
   at System.Net.WebClient.UploadString(Uri address, String method, String data)
   at Rates.RetrieveLatest() in D:\home\site\repository\AlexaRates\Rates.cs:line 50
   at AlexaRates.Controllers.RatesController.Get() in D:\home\site\repository\AlexaRates\Controllers\RatesController.cs:line 22
   at lambda_method(Closure , Object , Object[] )
   at Microsoft.Exten

有没有人经历过类似的事情?我看到一堆403帖子,但它们主要是关于人们调用服务上托管的REST API而不是呼叫。

3 个答案:

答案 0 :(得分:1)

403禁止错误通常意味着服务器理解请求但拒绝授权。

  1. 根据您的错误消息,似乎错误发生在Rates类和RatesController类中,您没有向我们展示。您可以使用远程调试来设置断点以检查这些类中的代码。
  2. 您说该项目在本地运行正常,但在Azure中出现错误,因此请确保您已将所有项目和数据源发布到Azure。检查'_baseUrl'是否来自Azure。并确保您已启动Azure App Service。
  3. 403禁止错误可能还有其他原因。例如页面缓存和登录cookie。您可以参考此article来了解如何修复403 Forbidden Error。
  4.   

    403禁止错误的原因

         

    403错误几乎总是由您尝试访问无权访问的内容引起的。

答案 1 :(得分:0)

尝试添加标头并执行各种其他操作后,最终结果是相同的 - 我在调用Web服务时遇到403错误。

解决方案是从Web App转换为VM,并使用旧的学校设置在那里部署应用程序。该应用程序在那里工作。

答案 2 :(得分:0)

我的解决方法是,我意识到我们的基础架构人员在azure应用程序上添加了IP限制。这就是该应用以403反弹的原因。

我删除了“网络”->“访问限制”页面上的IP限制。