Ошибка неверного запроса Microsoft Translator (400)
Я видел темы по этому вопросу, но моя проблема особенно запутанная. У меня есть бесплатная подписка на 2 миллиона символов, действительный идентификатор клиента и секрет. Когда я запускаю свой код, я несколько раз успешно вызываю API (максимум, что я видел, это 75 последовательных успешных вызовов). Затем каждый второй вызов возвращает неверный запрос: удаленный сервер возвратил ошибку: (400) неверный запрос.
Я создаю токен один раз со своими учетными данными и никогда не создаю его снова. Я перебираю файл, анализирую его и отправляю каждую проанализированную строку для перевода, вызывая API. Кажется, что я достиг своего рода предела, о котором я сейчас знаю.
Когда я смотрю на мой аккаунт, кажется, что он не сбрасывает со счетов уже переведенные символы, что вызывает у меня сильное подозрение, что у меня неправильные учетные данные при создании токена. Я четыре раза проверил это, и все, кажется, в порядке.
Любое руководство о том, что я могу упустить здесь, будет высоко ценится.
Вот код, который создает токен. Однако я думаю, что может быть неизвестное ограничение, о котором я не знаю с бесплатной подпиской.
static void gettoken()
{
//Get access token
string clientID = "my client id";
string clientSecret = "my secret";
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", clientID, 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);
}
System.Net.WebResponse webResponse = webRequest.GetResponse();
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(AdmAccessToken));
AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
MyGlobals.headerValue = "Bearer " + token.access_token;
}
А вот код, который вызывает сам API. Я вызываю метод API из цикла.
static void RunBing(string sterm)
{
//Submit the translation request
string txtToTranslate = sterm;
string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + txtToTranslate + "&from=en&to=es";
System.Net.WebRequest translationWebRequest = System.Net.WebRequest.Create(uri);
translationWebRequest.Headers.Add("Authorization", MyGlobals.headerValue);
System.Net.WebResponse response = null;
try {
response = translationWebRequest.GetResponse();
}
catch (Exception e)
{
Console.WriteLine("Term failed: " + sterm);
Console.WriteLine(e);
return;
}
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());
MyGlobals.xlation = xTranslation.InnerText;
}
После нескольких успешных вызовов API я получаю следующее сообщение: System.Net.WebException: удаленный сервер возвратил ошибку: (400) Bad Request. в System.Net.HttpWebRequest.GetResponse() в Translate.TranslateText.Program.RunBing(String sterm)