2016-06-28 93 views
1

我将MS Translator API实施为C#控制台应用程序。 我的订阅级别是付费帐户,而不是免费级别。 每次我开始打电话时,第1-5个翻译都能正常工作。 之后,我得到和无尽的400(坏请求)例外流。Microsoft Translator无法连续返回400

这里是文本响应我得到:

响应文本:TranslateApiException方法:翻译()消息: 无法找到与请求credentials.message 关联的活动Azure的市场广场翻译认购 id = 3832.V2_Rest.Translate.117038D9

我错过了什么?我绝对包括代码中的应用程序ID和密钥?

我打算还提供一些额外的凭据?

这是我的翻译班: 任何想法?

// -------------------------------------------------------------------- 
public class Translator 
{ 
    private string AccessToken; 
    private DateTime TokenExpirationDate; 

    // ---------------------------------------------------------------- 
    public Translator() 
    { 
     AccessToken = ""; 
     TokenExpirationDate = new DateTime(2000, 1, 1); 
    } 

    // -------------------------------------------------------------- 
    public void GetAccessToken() 
    { 
     if (AccessToken != "" && DateTime.Now < TokenExpirationDate) 
     { 
      Console.WriteLine("Translator: usng existing token"); 
      return; 
     } 

     AccessToken = ""; 
     string clientID = "<-removed->"; 
     string clientSecret = "<-also-removed->"; 
     String strTranslatorAccessURI = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"; 
     String strRequestDetails = 
       string.Format("grant_type=client_credentials&client_id={0}&client_secret={1} &scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientID), 
       HttpUtility.UrlEncode(clientSecret)); 

     System.Net.WebRequest webRequest = System.Net.WebRequest.Create(strTranslatorAccessURI); 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 
     webRequest.Method = "POST"; 
     byte[] bytes = System.Text.Encoding.ASCII.GetBytes(strRequestDetails); 
     webRequest.ContentLength = bytes.Length; 
     using (System.IO.Stream outputStream = webRequest.GetRequestStream()) 
     { 
      outputStream.Write(bytes, 0, bytes.Length); 
     } 

     WebResponse webResponse = null; 
     try 
     { 
      webResponse = webRequest.GetResponse(); 
     } 
     catch (Exception ex) 
     { 
      AccessToken = ""; 
      Console.WriteLine("Exception: " + ex.Message); 
     } 
     if (webResponse != null) 
     { 
      System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(AdmAccessToken)); 
      AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream()); 
      AccessToken = token.access_token; 
      TokenExpirationDate = DateTime.Now.AddSeconds(Convert.ToDouble(token.expires_in)); 

      if (AccessToken.Length > 0) Console.WriteLine("Translator: got an access token."); 
     } 
    } 

    // ------------------------------------------------------------------- 
    public string Translate(string textToTranslate, string destLanguageCode) 
    { 
     Console.WriteLine("Translator(" + destLanguageCode + "):" + textToTranslate); 

     string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(textToTranslate) + "&from=en&to=" + destLanguageCode; 
     System.Net.WebRequest translationWebRequest = System.Net.WebRequest.Create(uri); 
     translationWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken); 
     System.Net.WebResponse response = null; 

     try 
     { 
      response = translationWebRequest.GetResponse(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Translator: Fail: " + ex.Message); 
      Console.WriteLine("Exception: " + ex.Message); 
     } 
     if (response != null) 
     { 
      System.IO.Stream stream = response.GetResponseStream(); 
      System.Text.Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); 

      System.IO.StreamReader translatedStream = new System.IO.StreamReader(stream, encode); 
      System.Xml.XmlDocument xTranslation = new System.Xml.XmlDocument(); 
      xTranslation.LoadXml(translatedStream.ReadToEnd()); 

      Console.WriteLine("Translator(" + destLanguageCode + "):" + xTranslation.InnerText); 
      return xTranslation.InnerText; 
     } 

     return ""; 
    } 
} 

// ------------------------------------------------------------------------ 
public class AdmAccessToken 
{ 
    public string access_token { get; set; } 
    public string token_type { get; set; } 
    public string expires_in { get; set; } 
    public string scope { get; set; } 
} 

}

+1

没有看代码 - 前几个请求正在运行*的事实表明*您可能会受到速率限制。你多久做一次这些请求?你是否遵守API规定的条款和条件? – user1666620

+0

400 - 错误的请求也可能意味着您的请求格式不正确。您是否尝试过在提琴手中观看该请求以查看是否有问题? – Jake

+0

适用于4个或5个请求。然后不间断的400。 –

回答

1

看那响应的内容。它将以可读的形式包含错误的原因。 您很可能没有与您的请求凭据相关联的订阅。解决方法:

+0

我最初的帖子很清楚地表明我正在为一个帐户付款,并且已经在应用程序中拥有客户端ID和密钥。 –

+0

确保订阅了“Microsoft Translator - Text Translation”。 –