2012-06-12 61 views
4

以前那裏可以通過SOAP接口輕鬆訪問bing翻譯器。現在它已經遷移到Windows Azure。我已在Azure市場上註冊每月10000封信件(免費)。如何通過翻譯器API翻譯文本,用於C#中的Windows Phone?請幫忙。我不知道如何使用BeginExecute和EndExecute進行查詢。如何通過Windows Azure使用Microsoft Translator API,適用於Windows Phone?

我已經下載並將TranslatorContainer.cs添加到我的項目中。現在我只是試圖用GetLanguagesForTranslation方法獲取語言。這是我寫的代碼。

public partial class PhonePage1 : PhoneApplicationPage 
{ 

    public PhonePage1() 
    { 
     InitializeComponent(); 

     Translator transInstance = new Translator(); 

    } 
    class Translator 
    { 
     private Uri service_root; 
     private TranslatorContainer context; 

     public Translator() 
     { 
      service_root = new Uri("https://api.datamarket.azure.com/Bing/MicrosoftTranslator/"); 
      context = new TranslatorContainer(service_root); 
      context.Credentials = new NetworkCredential("ID","..........."); 
      var query = context.GetLanguagesForTranslation(); 
      query.BeginExecute(OnQueryComplete, query); 
     } 

     public void OnQueryComplete(IAsyncResult result) 
     { 
      var query = result as DataServiceQuery<Language>; 

      string langstring = ""; 
      foreach (Language lang in query.EndExecute(result)) 
      { 
       langstring += lang.Code + "\n"; 
      } 
      MessageBox.Show(langstring); 
     } 
    } 
} 

在OnQueryComplete()中,即使在賦值之後,query也爲null。結果具有屬性IsCompleted爲true,並且statusCode爲OK。 我無法弄清楚如何去做這件事。請幫忙。 謝謝

回答

3

與必應翻譯團隊幫助我得到了它在我的Silverlight應用程序的工作:

  1. UseDefaultCredentials需要被關閉的代理

  2. 在異步回調,你鑄造結果到一個DSQ,但它是結果的AsyncState需要被鑄造。見下文。

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
        var serviceUri = new Uri("https://api.datamarket.azure.com/Bing/MicrosoftTranslator/"); 
        var accountKey = "**********************"; // 
        var tcode = new Microsoft.TranslatorContainer(serviceUri); 
    
        tcode.Credentials = new NetworkCredential(accountKey, accountKey); 
        tcode.UseDefaultCredentials = false; 
        var query = tcode.GetLanguagesForTranslation(); 
        query.BeginExecute(OnQueryComplete, query); 
    } 
    
    public void OnQueryComplete(IAsyncResult result) 
    { 
        var query = (DataServiceQuery<Microsoft.Language>)result.AsyncState; 
        var enumerableLanguages = query.EndExecute(result); 
        string langstring = ""; 
        foreach (Microsoft.Language lang in enumerableLanguages) 
        { 
         langstring += lang.Code + "\n"; 
        } 
        MessageBox.Show(langstring); 
    } 
    

這樣,您就可以使用BeginExecute()和BeginEnd()來獲取異步結果。

+1

非常感謝。我認爲這應該工作,但UseDefaultCredentials是哪個類的屬性。它應該是用戶定義的嗎?它不是所提供的TranslatorContainer類的一部分。 –

+0

我可以在網上聊到你嗎?我想問一些關於這方面的事情。 –

+0

@Avkash - 我收到類似的錯誤作爲OP。我試圖添加將「UseDefaultCredentia ls」設置爲false的代碼行,但TranslatorContainer中的該變量不可用。你能解釋一下嗎?我在C#中爲本地Windows應用程序工作。 – trumpetlicks

2

我有完全相同的問題,我被建議這個問題可能與Async結果在調用GetLanguagesForTranslation時如何返回內部有關,但是我沒有深入挖掘,只是使用Execute()來獲取語言列表如下:

var serviceUri = new Uri("https://api.datamarket.azure.com/Bing/MicrosoftTranslator/"); 
var accountKey = "***********************"; // 
var tcode = new TranslatorContainer(serviceUri); 
tcode.Credentials = new NetworkCredential(accountKey, accountKey); 
var languages = tcode.GetLanguagesForTranslation().Execute().ToArray(); 
foreach (var i in languages) 
{ 
    Console.WriteLine(i.Code); 
} 

不知道這是你在找什麼,但它在我的情況很好。

+0

我可以理解你在說什麼,但是沒有Execute方法。在這種情況下,Silverlight將只允許異步調用。所以,我必須使用BeginExecute(),但那就是我不知道如何使用。如果你對此有所瞭解,請幫忙。 –

+0

當然,Vignesh會很樂意幫助你。我會嘗試找到一些信息並在此添加..不能說需要多長時間,但我肯定會嘗試看看我能爲你獲得什麼。請保持曲調..謝謝! – AvkashChauhan

相關問題