【问题标题】:502 Invalid Response when calling Google Api from Azure Website从 Azure 网站调用 Google Api 时出现 502 无效响应
【发布时间】:2014-11-09 14:10:38
【问题描述】:

当我从 Azure 网站调用 Google API 时,我收到 502 - Web 服务器在充当网关或代理服务器时收到无效响应。确切的代码可以在我的本地机器和 Azure VM 上运行。

代码只是从 Google 用户 ID 中获取显示名称

private string GetUserDetails(string userId)
{
    var serviceAccountEmail = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com";
    var certFile = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/googlekey.p12");
    var certificate = new X509Certificate2(certFile, "notasecret", X509KeyStorageFlags.Exportable);

    var credential = new ServiceAccountCredential(
       new ServiceAccountCredential.Initializer(serviceAccountEmail)
       {
           Scopes = new[] { PlusService.Scope.PlusMe }
       }.FromCertificate(certificate));

    var service = new PlusService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = "Bayfront"
    });

    var request = service.People.Get(userId);
    var person = request.Execute();
    return person.DisplayName;
}

这是在 WebApi 项目中调用的,但我已将其提取到 http://testgplus.azurewebsites.net/ 的单页 asp.net 网络表单中

我还尝试了一个带有 ApiKey 的简单 REST 客户端,而不是使用上面的。这同样适用于 VM,但不适用于我得到 ​​403 Forbidden 的网站。我已将网站和虚拟机的 IP 地址添加到 Google Developers Console。

private string GetUserDetails2(string userId)
{
    var client = new RestClient("https://www.googleapis.com/plus/v1/people/" + userId);
    var request = new RestRequest(Method.GET);
    request.AddParameter("key", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    var response = client.Execute(request);
    if (response.StatusCode == HttpStatusCode.OK)
    {
        dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(response.Content);

        return result["name"]["givenName"];
    }
    return response.StatusCode.ToString();
}

我似乎无法为 Azure 网站调用外部 Web 服务。我见过一些类似的问题,例如502 requesting payment service inside azure 'website',但没有任何建议奏效。有没有人对可能的原因或解决方法有任何想法?

【问题讨论】:

    标签: azure google-api


    【解决方案1】:

    我之前看到过您的问题,但没有注意到解决方案...我现在也有..生成证书时添加:

    var certificate = new X509Certificate2(p12Path, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
    //(notice the X509KeyStorageFlags.MachineKeySet |)
    

    【讨论】:

      【解决方案2】:

      。嗨科林 Mierowsky

      您在哪里创建证书,在 Application_Start 或 WebApiConfig 注册方法中?

      这段代码在哪里使用?

      makecert -r -n "CN=abdullahsargin.com, E=sargin48@gmail.com" -sky exchange -b 11/01/2015 -pe -sv myhost.pvk myhost.cer
      
      pvk2pfx -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po Test.123
      

      在 global.asax application_start 中

               try
              {
                  var certFile = Server.MapPath("~/App_Data/myhost.pfx");
                  var cert = new X509Certificate2(certFile, "Test.123",
                      X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
              }
              catch (Exception exc)
              {
                  _tools.LogError(exc);
              }
      

      。 此方法在本地运行成功,但在 azure 中获取 502 在此代码上,我测试此方法行和行

        var code = await _userManager.GeneratePasswordResetTokenAsync(user.Id);
      

      这个方法完成

          [HttpGet, AllowAnonymous]
          public async Task<HttpResponseMessage> ForgotPassword([FromUri] ForgotPasswordViewModel model)
          {
              try
              {               
                  var code = await _userManager.GeneratePasswordResetTokenAsync(user.Id);
      
                  return Request.CreateResponse(HttpStatusCode.OK, new { model = user });
      
                  var url = "http://abdullahsargin.com#/account/resetPassword/" + user.Id + "/" + code;
      
                  await _userManager.SendEmailAsync(user.Id, "Reset Password",
                  "Please reset your password by clicking here: <a href=\"" + url + "\">link</a>");
      
                  return Request.CreateResponse(HttpStatusCode.OK);
              }
              catch (Exception exc)
              {
                  MyTools.LogError(exc.GetBaseException());
                  return Request.CreateResponse(HttpStatusCode.BadRequest, exc.GetBaseException());
              }
          }
      

      我在这个页面上找到了我的解决方案

      ASP.NET Identity: use GeneratePasswordResetToken on Azure website

      我的解决方案

      public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))
      {
          // other setup
          this.UserTokenProvider = new TotpSecurityStampBasedTokenProvider<ApplicationUser, string>();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多