首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

远程服务器返回异常:(400)异常的请求,微软的翻译接口

2012-05-10 
远程服务器返回错误:(400)错误的请求,微软的翻译接口最近在用微软的翻译接口,但也是报 远程服务器返回错误

远程服务器返回错误:(400)错误的请求,微软的翻译接口
最近在用微软的翻译接口,但也是报 远程服务器返回错误:(400)错误的请求, 问题出在下面我标示为红色的代码,请高手指点一下错在哪了
static void Main(string[] args)
  {
  AdmAccessToken admToken;
  string headerValue;
  //Get Client Id and Client Secret from https://datamarket.azure.com/developer/applications/
  //Refer obtaining AccessToken (http://msdn.microsoft.com/en-us/library/hh454950.aspx)  
  string clientID = "hongxuebiaoTranslator";
  string clientSecret = "KJn2ZfUPAAruDJECbpg7MrzsNWGiHtcmjmeQJYkD6hw";
  AdmAuthentication admAuth = new AdmAuthentication(clientID, clientSecret);
  try
  {
  admToken = admAuth.GetAccessToken();
  // Create a header with the access_token property of the returned token
  headerValue = "Bearer " + admToken.access_token;
  TranslateMethod(headerValue);
  }
  catch (WebException e)
  {
  ProcessWebException(e);
  Console.WriteLine("Press any key to continue...");
  Console.ReadKey(true);
  }
  catch (Exception ex)
  {

  Console.WriteLine(ex.Message);
  Console.WriteLine("Press any key to continue...");
  Console.ReadKey(true);
  }
  }
  private static void TranslateMethod(string authToken)
  {

  string text = "Use pixels to express measurements for padding and margins.";
  string from = "en";
  string to = "de";

  string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(text) + "&from=" + from + "&to=" + to;

  HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
  httpWebRequest.Headers.Add("Authorization", authToken);
  WebResponse response = null;
  try
  {
  response = httpWebRequest.GetResponse();
  using (Stream stream = response.GetResponseStream())
  {
  System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
  string translation = (string)dcs.ReadObject(stream);
  Console.WriteLine("Translation for source text '{0}' from {1} to {2} is", text, "en", "de");
  Console.WriteLine(translation);

  }
  Console.WriteLine("Press any key to continue...");
  Console.ReadKey(true);
  }
  catch
  {
  throw;
  }
  finally
  {
  if (response != null)
  {
  response.Close();
  response = null;
  }
  }
  }
  private static void ProcessWebException(WebException e)
  {
  Console.WriteLine("{0}", e.ToString());
  // Obtain detailed error information
  string strResponse = string.Empty;
  using (HttpWebResponse response = (HttpWebResponse)e.Response)
  {
  using (Stream responseStream = response.GetResponseStream())
  {
  using (StreamReader sr = new StreamReader(responseStream, System.Text.Encoding.ASCII))
  {
  strResponse = sr.ReadToEnd();
  }
  }
  }
  Console.WriteLine("Http status code={0}, error message={1}", e.Status, strResponse);
  }
  }
  [DataContract]
  public class AdmAccessToken
  {
  [DataMember]
  public string access_token { get; set; }
  [DataMember]
  public string token_type { get; set; }


  [DataMember]
  public string expires_in { get; set; }
  [DataMember]
  public string scope { get; set; }
  }

  public class AdmAuthentication
  {
  public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
  private string clientId;
  private string cientSecret;
  private string request;

  public AdmAuthentication(string clientId, string clientSecret)
  {
  this.clientId = clientId;
  this.cientSecret = clientSecret;
  //If clientid or client secret has special characters, encode before sending request
  this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
  }

  public AdmAccessToken GetAccessToken()
  {
  return HttpPost(DatamarketAccessUri, this.request);
  }

  private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
  {
  //Prepare OAuth request  
  WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
  webRequest.ContentType = "application/x-www-form-urlencoded";
  webRequest.Method = "POST";
  byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
  webRequest.ContentLength = bytes.Length;
  using (Stream outputStream = webRequest.GetRequestStream())
  {
  outputStream.Write(bytes, 0, bytes.Length);
  }
  using (WebResponse webResponse = webRequest.GetResponse())
  {
  DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
  //Get deserialized object from JSON stream
  AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
  return token;
  }
  }

[解决办法]
http://msdn.microsoft.com/en-us/library/ff512421.aspx

看这个链接。

Required的属性都要追加到string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(text) + "&from=" + from + "&to=" + to;
这行代码的QueryString的参数中。

试试看吧。

其实翻译接口的帮助就在http://api.microsofttranslator.com/v2/Http.svc这,直接访问它,找到你使用的Http方式的帮助,就能看见各个方法的必须参数了。

热点排行