3

以前は、SOAP インターフェイスを使用して bing トランスレータに簡単にアクセスできました。現在、Windows Azure に移行されています。毎月 10000 文字 (無料) の Azure マーケットプレースに登録しました。C# で Windows Phone の翻訳 API を使用してテキストを翻訳するにはどうすればよいですか? 助けてください。クエリに BeginExecute と EndExecute を使用する方法がわかりません。

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 です。これについてどうすればよいかわかりません。助けてください。ありがとうございました

4

2 に答える 2

3

Bing Translatorチームの助けを借りて、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()を使用して非同期結果を取得できます。

于 2012-06-15T21:00:23.037 に答える
2

私はまったく同じ問題を抱えていました.GetLanguagesForTranslationを呼び出すときに非同期結果が内部的に返される方法に問題が関連している可能性があることが示唆されました.

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);
}

それがあなたが探しているものかどうかはわかりませんが、私の場合はうまくいきました。

于 2012-06-13T02:43:10.730 に答える