C# 如何在Windows Azure上为Windows Phone使用Microsoft Translator API?

C# 如何在Windows Azure上为Windows Phone使用Microsoft Translator API?,c#,silverlight,windows-phone-7,azure,microsoft-translator,C#,Silverlight,Windows Phone 7,Azure,Microsoft Translator,在此之前,bing翻译程序可以通过SOAP接口轻松访问。现在它已迁移到Windows Azure。我已经在Azure marketplace注册了每月10000封信(免费)。如何通过C#中windows phone的translator api翻译文本?请帮忙。我不知道如何使用BeginExecute和EndExecute进行查询 我已下载TranslatorContainer.cs并将其添加到我的项目中。目前,我只是尝试使用GetLanguagesForTranslation方法获取语言。这是

在此之前,bing翻译程序可以通过SOAP接口轻松访问。现在它已迁移到Windows Azure。我已经在Azure marketplace注册了每月10000封信(免费)。如何通过C#中windows phone的translator 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);
        }
    }
}
公共部分类PhonePage1:PhoneApplicationPage
{
公用电话第1页()
{
初始化组件();
Translator transInstance=新的Translator();
}
类转换器
{
私有Uri服务\u根;
私人译者语境;
公共翻译()
{
服务\u根=新Uri(“https://api.datamarket.azure.com/Bing/MicrosoftTranslator/");
上下文=新的TranslatorContainer(服务\根);
context.Credentials=新的网络凭据(“ID”、“……”);
var query=context.GetLanguagesForTranslation();
query.BeginExecute(OnQueryComplete,query);
}
查询完成时公共作废(IAsyncResult结果)
{
var query=作为DataServiceQuery的结果;
字符串langstring=“”;
foreach(query.EndExecute(result)中的语言lang)
{
langstring+=lang.Code+“\n”;
}
MessageBox.Show(langstring);
}
}
}
在OnQueryComplete()中,
查询
即使在赋值之后也是空的。结果的属性IsCompleted为true,statusCode为OK。 我不知道该怎么做。请帮忙。
谢谢

我遇到了完全相同的问题,有人建议,这个问题可能和调用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);
}

不确定这是否是你正在寻找的,但它在我的情况下运作良好

在Bing翻译团队的帮助下,我让它在Silverlight应用程序中运行:

  • 需要在代理服务器上关闭UseDefaultCredentials

  • 在异步回调中,您将结果强制转换为DSQ,但需要强制转换的是结果的异步状态。见下文

    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);
    }
    
    private void按钮\u单击\u 1(对象发送者,路由目标)
    {
    var serviceUri=新Uri(“https://api.datamarket.azure.com/Bing/MicrosoftTranslator/");
    var accountKey=“**********************”;//
    var tcode=新的Microsoft.TranslatorContainer(serviceUri);
    tcode.Credentials=新的网络凭据(accountKey,accountKey);
    tcode.UseDefaultCredentials=false;
    var query=tcode.GetLanguagesForTranslation();
    query.BeginExecute(OnQueryComplete,query);
    }
    查询完成时公共作废(IAsyncResult结果)
    {
    var query=(DataServiceQuery)result.AsyncState;
    var enumerableLanguages=query.EndExecute(结果);
    字符串langstring=“”;
    foreach(enumerableLanguages中的Microsoft.lang语言)
    {
    langstring+=lang.Code+“\n”;
    }
    MessageBox.Show(langstring);
    }
    

  • 通过这种方式,您可以使用BeginExecute()和BeginEnd()获得异步结果。

    我可以理解您的意思,但没有执行方法。在这种情况下,Silverlight只允许异步调用。因此,我必须使用BeginExecute(),但我不确定如何使用它。如果你知道这件事,请帮忙。当然,维格内斯,我很乐意帮你。我将尝试查找一些信息并在此处添加。。我不能说要花多长时间,但我一定会尽力看看我能为你做些什么。请留下来…谢谢!!谢谢。我认为这应该有效,但UseDefaultCredentials是哪个类的属性。它应该是用户定义的吗?这不是提供的TranslatorContainer类的一部分。我可以在网上聊天吗?关于这一点,我想问几个问题。@Avkash-我遇到了与OP类似的错误。我正在尝试添加设置“UseDefaultCredentia”的代码行‌​ls”设置为false,但TranslatorContainer中的该变量不可用。你能解释一下吗?我在C#为一个本地windows应用程序工作。