Microsoft Translator连续返回400失败

本文关键字:失败 返回 连续 Translator Microsoft | 更新日期: 2023-09-27 17:52:33

我在c#控制台应用程序中实现了MS Translator API。我的订阅级别是一个高级付费帐户,而不是免费级别。每次我开始调用它时,前1-5个翻译都很好。在那之后,我得到了无尽的400(错误请求)异常流。

这是我得到的文本响应:

Response Text: TranslateApiException Method: Translate() Message:无法找到活动的Azure市场翻译器订阅与请求凭据消息相关联id = 3832. v2_rest.translate.117038d9

我错过了什么?我肯定包括在代码中的应用程序id和密钥?

我还需要提供一些额外的证书吗?

下面是我的Translator类:什么好主意吗?
// --------------------------------------------------------------------
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; }
}

}

Microsoft Translator连续返回400失败

查看响应的内容。它将以人类可读的形式包含错误的原因。您可能没有与请求的凭据关联的订阅。修改:

  • 访问https://datamarket.azure.com/account/datasets并确保您已订阅"Microsoft Translator - Text Translation"。
  • 访问https://datamarket.azure.com/developer/applications并定义客户端ID和密码
  • 在应用程序中使用该客户端ID和密码。