この問題に関するスレッドを見てきましたが、私の問題は特に混乱しています。200 万文字の無料サブスクリプション、有効なクライアント ID とシークレットがあります。コードを実行すると、API を数回正常に呼び出すことができます (私が見た中では、連続して 75 回の呼び出しが成功しました)。次に、他のすべての呼び出しが不正な要求応答を返します。リモート サーバーがエラーを返しました: (400) 不正な要求。
資格情報を使用して一度トークンを作成し、二度と作成しません。ファイルをループして解析し、API を呼び出して、解析されたすべての文字列を翻訳用に送信します。私が今気づいているある種の限界に達しているようです。
私のアカウントを見ると、既に翻訳した文字が割り引かれているようには見えないため、トークンを作成するときに資格情報が間違っているのではないかと非常に疑わしくなります。私はそれを4回チェックしましたが、すべて問題ないようです。
ここで私が見逃している可能性があるものについてのガイダンスは大歓迎です。
トークンを作成するコードは次のとおりです。ただし、無料サブスクリプションでは認識していない未知の制限がある可能性があると思います.
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) 要求が正しくありません。System.Net.HttpWebRequest.GetResponse() で Translate.TranslateText.Program.RunBing(文字列スターム) で