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

首先要申请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", "");
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值