Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Microsoft Translator无法返回400_C#_Api_Translation - Fatal编程技术网

C# Microsoft Translator无法返回400

C# Microsoft Translator无法返回400,c#,api,translation,C#,Api,Translation,我用C#控制台应用程序实现了MS Translator API。 我的订阅级别是付费帐户,而不是免费帐户。 每次我开始叫它,前1-5个翻译都很好。 在这之后,我得到了400个(错误请求)异常的无休止的流 以下是我收到的文本回复: 响应文本:translateAppiexception方法:Translate()消息: 找不到活动的Azure Market Place转换器订阅 与请求凭据关联。消息 id=3832.V2_Rest.Translate.117038D9 我错过了什么?我最肯定的是在

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

以下是我收到的文本回复:

响应文本:translateAppiexception方法:Translate()消息: 找不到活动的Azure Market Place转换器订阅 与请求凭据关联。消息 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; }
}
//--------------------------------------------------------------------
公共类翻译器
{
私有字符串访问令牌;
私有日期时间令牌到期日期;
// ----------------------------------------------------------------
公共翻译()
{
AccessToken=“”;
TokenExpirationDate=新的日期时间(2000,1,1);
}
// --------------------------------------------------------------
public void GetAccessToken()
{
如果(AccessToken!=“”&&DateTime.Now0)Console.WriteLine(“Translator:获取访问令牌”);
}
}
// -------------------------------------------------------------------
公共字符串翻译(字符串textToTranslate、字符串destLanguageCode)
{
Console.WriteLine(“Translator”(+destLanguageCode+):+textToTranslate);
字符串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(“授权”、“承载人”+访问令牌);
System.Net.WebResponse response=null;
尝试
{
response=translationWebRequest.GetResponse();
}
捕获(例外情况除外)
{
Console.WriteLine(“转换器:失败:+ex.Message”);
Console.WriteLine(“异常:+ex.Message”);
}
if(响应!=null)
{
System.IO.Stream=response.GetResponseStream();
System.Text.Encoding encode=System.Text.Encoding.GetEncoding(“utf-8”);
System.IO.StreamReader translatedStream=新的System.IO.StreamReader(流,编码);
System.Xml.XmlDocument xtransation=new System.Xml.XmlDocument();
LoadXml(translatedStream.ReadToEnd());
Console.WriteLine(“Translator”(+destLanguageCode+):+xtransation.InnerText);
返回xtransation.InnerText;
}
返回“”;
}
}
// ------------------------------------------------------------------------
公共类AdmAccessToken
{
公共字符串访问\u令牌{get;set;}
公共字符串标记\u类型{get;set;}
{get;set;}中的公共字符串过期
公共字符串作用域{get;set;}
}

}查看响应的内容。它将以人类可读的形式包含错误的原因。 您可能没有与请求的凭据关联的订阅。要解决这个问题:

  • 访问并确保您已订阅“Microsoft Translator-文本翻译”
  • 访问并定义客户端ID和密码
  • 在应用程序中使用该客户端ID和密码

不看代码-前几个请求正在工作的事实表明,您可能会受到速率限制。您多久做一次这些请求?您是否遵守API规定的T&C?400错误的请求也可能意味着您的请求格式不正确。您是否尝试过在Fiddler中查看请求以查看是否有问题?它适用于4或5个请求。然后是不间断的400。然后它必须是速率限制。不要每秒做几次请求。我的第一篇帖子相当清楚地表明了这一点