wcf ria服务方法返回

时间:2011-03-25 17:18:58

标签: silverlight silverlight-4.0 wcf ria

我有一个带有wcf ria服务的Silverlight站点,这只是一个测试。 该服务如下

[EnableClientAccess()]
    public class PersonService : DomainService
    {
        [Invoke]
        public string[] GetPersonNames()
        {
            return new string[] { "abc", "cba", "ddd", "ttt" };
        }

        [Invoke]
        public string GetName()
        {
            return "teste";
        }

        [Invoke]
        public string Test(string str)
        {
            return str;
        }
    }

我有一个xaml页面,我称之为服务

SLRiaTest.Web.PersonContext person = new SLRiaTest.Web.PersonContext();

        public MainPage()
        {
            InitializeComponent();

            person.GetPersonNames(OnFinished,null);
        }

        private void OnFinished(InvokeOperation<string[]> obj)
        {
            var list = obj.Value;

        }

但是Value总是为null,而我在serice中的断点永远不会被击中。我搜索互联网的高低,找不到任何可能告诉我我做错的事情,任何帮助都会很棒,我很绝望......我想我可以在没有实体框架的情况下使用RIA服务?

2 个答案:

答案 0 :(得分:1)

有关RIA服务中有线电话有效和无效的详细信息很复杂。如果你想详细解答这里发生的事情,你可以更好地询问RIA Services forum

但是,你有点反对RIA服务的设计。如果要返回对象集合,则应使用Query而不是Invoke。

[EnableClientAccess()]
public class PersonService : DomainService
{
    [Query]
    public IEnumerable<string> GetPersonNames()
    {
        return new string[] { "abc", "cba", "ddd", "ttt" };
    }
}

...

    public MainPage()
    {
        InitializeComponent();

        person.Load(person.GetPersonNamesQuery(), OnFinished, null);
    }

    private void OnFinished(LoadOperation<IEnumerable<string>> obj)
    {
        var list = obj.Value;
    }

我刚刚做到了这一点,所以可能会有一些小错误。但这是一般的想法。

答案 1 :(得分:0)

我有一个你正在尝试的实例。您无需更改域名服务。确保您已安装Visual Studio 2001 SP1,它还将WCF RIA更新为SP1。

在您的Silverlight页面中,您可以按如下方式调用域名服务:

public partial class MainPage : UserControl
    {
        private PersonContext _ctx = new PersonContext();

        public MainPage ()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler( MainPage_Loaded );
        }

        private void MainPage_Loaded ( object sender, RoutedEventArgs e )
        {
            _ctx.GetPersonNames( ( op ) =>
                {
                    if ( !op.HasError )
                    {
                        // The data here is your String[]
                        var data = op.Value;
                    }
                }, null );
        }
    }