【发布时间】:2016-07-07 02:33:20
【问题描述】:
我在 C# 控制台应用程序中实现了 MS Translator API。 我的订阅级别是付费帐户,而不是免费级别。 每次我开始调用它时,前 1-5 个翻译都可以正常工作。 之后,我得到了源源不断的 400(错误请求)异常。
这是我收到的文本回复:
响应文本:TranslateApiException 方法:Translate() 消息: 找不到有效的 Azure 市场翻译器订阅 与请求相关的 credentials.message 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; }
}
}
【问题讨论】:
-
不查看代码 - 前几个请求正在运行的事实表明您可能受到速率限制。您多久执行一次这些请求?您是否遵守 API 规定的 T&C?
-
A 400 - Bad Request 也可能意味着您的请求格式不正确。有没有试过在 Fiddler 中查看请求是否有问题?
-
它适用于 4 或 5 个请求。然后是不间断的 400 次。
-
那肯定是限速了。不要每秒执行多个请求。
标签: c# api translation