C#调用Bing的在线翻译接口Translator

来源:互联网 发布:正在识别网络 编辑:程序博客网 时间:2024/06/04 18:16

首先要申请Developer账户,申请完毕后在https://datamarket.azure.com/account可以看到账户名和密码。
也可以申请一个应用程序,同样可以当做调用Translator接口的账户和密码。

按MSDN上的示例简单重构了一个静态类:

internal static class Translator{public static string TranslateString(string text, string fromCulture, string toCulture){string translateResult = "";AdmAccessToken admToken;//使用应用程序名,密码//AdmAuthentication admAuth = new AdmAuthentication("TranslateHelper", "******");//使用账户名,密码AdmAuthentication admAuth = new AdmAuthentication("955aaf93-127b-45ef-84ba-509cc094e05c", "*******");try{admToken = admAuth.GetAccessToken();//string text = "查询条件";//string from = "zh-CHS";//string to = "en";string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(text) + "&from=" + fromCulture + "&to=" + toCulture;string authToken = "Bearer" + " " + admToken.access_token;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"));translateResult = (string)dcs.ReadObject(stream);}}catch (Exception e){MessageBox.Show(e.Message);}}catch (WebException e){ProcessWebException(e);}catch (Exception ex){MessageBox.Show(ex.Message);}return translateResult;}private static void ProcessWebException(WebException e){MessageBox.Show( e.ToString());// Obtain detailed error informationstring 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();}}}MessageBox.Show(string.Format("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 requestthis.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 streamAdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());return token;}}}


上述调用方法存在不稳定的情况,试了SOAP方式,还是比较稳定的:

要添加一个Service Reference:TranslatorService

private string Translate(string text, string from, string to){HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();AdmAuthentication admAuth = new AdmAuthentication("955aaf93-127b-45ef-84ba-509cc094e05c", "***");AdmAccessToken admToken = admAuth.GetAccessToken();string authToken = "Bearer" + " " + admToken.access_token;httpRequestProperty.Headers.Add("Authorization", authToken);TranslatorService.LanguageServiceClient client = new TranslatorService.LanguageServiceClient();using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)){OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;return client.Translate("", text, from, to, "text/plain", "");}}