2015-09-23 41 views
0

我开发了一个访问bit.ly以缩短url的ASP.NET MVC web应用程序。我使用.NET NuGet库Bitly.Net,因为它在Bit.ly Code Reference中被引用。从Azure网站访问时bit.ly无效登录

在我的本地机器上,无论是在单元测试中,还是在本地运行Web应用程序时,都能正常工作。但是,当我将它部署到Azure时,它失败了。不幸的是,Bitly.Net没有提供有用的错误反馈,但this SO answer显示很容易写出你自己的,所以我做到了。

现在调用shorten command,我得到一个错误代码500,错误文本显示'INVALID LOGIN'。

我正在使用折旧的身份验证方法,但看 documentation on shorten是不是说我可以使用该身份验证方法,它在本地工作,所以它不是。我可以交换到新的OAuth身份验证,但我认为它会有同样的问题。

是否有人从Azure访问过bit.ly API? CORS可能是一个问题?任何建议感激地收到。

回答

2

好吧,其实我是通过电子邮件发送bit.ly API支持([email protected])和他们亲切地回来,他们说:

的INVALID_LOGIN错误表示要么你提供了不正确的“登录”或不正确'apiKey'参数。

奇怪的是我通过记录它们并从Azure下载web.config来检查'login'和'apiKey'参数。然而,bit.ly支持人员建议我使用fixed OAuth Token(请阅读链接页面上的粗体首行以获取更多信息)。

这可以让您获得一次令牌,然后在您的所有请求中使用它,这使得使用OAuth变得容易。 我换到了OAuth,它工作!

如果这是有人在这里有用的是代码,based on @devfunkd implementation但更新为:

  • 使用固定的OAuth令牌进行验证。
  • 使用bit.ly的V3 API,它具有更好的json格式。
  • 它使用Json.NET json反序列化器。
  • 我使它异步。

请注意,在代码中,字段_bitlyToken应包含通过转到this page创建的令牌。 _logger变量包含一个记录器,以便记录错误。

public async Task<string> ShortenAsync(string longUrl) 
{ 
    //with thanks to @devfunkd - see https://stackoverflow.com/questions/31487902/nuget-package-for-bitly-to-shorten-the-links 

    var url = string.Format("https://api-ssl.bitly.com/v3/shorten?access_token={0}&longUrl={1}", 
      _bitlyToken, HttpUtility.UrlEncode(longUrl)); 

    var request = (HttpWebRequest) WebRequest.Create(url); 
    try 
    { 
     var response = await request.GetResponseAsync(); 
     using (var responseStream = response.GetResponseStream()) 
     { 
      var reader = new StreamReader(responseStream, Encoding.UTF8); 
      var jsonResponse = JObject.Parse(await reader.ReadToEndAsync()); 
      var statusCode = jsonResponse["status_code"].Value<int>(); 
      if (statusCode == (int) HttpStatusCode.OK) 
       return jsonResponse["data"]["url"].Value<string>(); 

      //else some sort of problem 
      _logger.ErrorFormat("Bitly request returned error code {0}, status text '{1}' on longUrl = {2}", 
       statusCode, jsonResponse["status_txt"].Value<string>(), longUrl); 
      //What to do if it goes wrong? I return the original long url 
      return longUrl; 
     } 
    } 
    catch (WebException ex) 
    { 
     var errorResponse = ex.Response; 
     using (var responseStream = errorResponse.GetResponseStream()) 
     { 
      var reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
      var errorText = reader.ReadToEnd(); 
      // log errorText 
      _logger.ErrorFormat("Bitly access threw an exception {0} on url {1}. Content = {2}", ex.Message, url, errorText); 
     } 
     //What to do if it goes wrong? I return the original long url 
     return longUrl; 
    } 
} 

我希望能帮到别人。

+0

全面解答与链接非常赞赏。 – user3085342