您的位置:首页 > 编程语言 > C#

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

2012-08-25 23:12 295 查看
首先要申请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 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();
}
}
}
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 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;
}
}
}


上述调用方法存在不稳定的情况,试了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", "");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: