发布到网站后,DataContract不起作用

时间:2013-04-29 16:21:12

标签: silverlight entity-framework wcf-ria-services

我试图自己解决,但......看起来我需要人们的帮助。 我有WCF RIA和EntityFramework的Business Silverlight应用程序。访问数据库我通过LinqToEntites获得。

我做的数据库的常见加载数据:

return DbContext.Customers

此代码从DataBase返回完整的Customers表。但有时我不需要显示所有数据。简单的方法是在客户端通过下一个代码使用linq过滤器:

public LoadInfo()
{
...
var LO1 = PublicDomainContext.Load(PublicDomainContext.GetCustomersQuery());
            LO1.Completed += LO1Completed;
...
}

private void LO1Completed(object sender, EventArgs eventArgs)
{
...
DatatViewGrid.ItemsSource = null;
DatatViewGrid.ItemsSource = loadOperation.Entities.Where(c=>c ...filtering...); 
//or PublicDomainContext.Customers.Where(c=>c ...filtering...)
...
}

然而,这种方式存在非常非常重要的缺陷:所有通过DomainService从服务器传递到客户端的数据都可能被 Fiddler 等应用程序查看。所以我需要提出另一种方式。

任务:过滤接收服务器端的数据并返回此数据。

方式#1: LinqToEntites有一个漂亮的投影方法:<​​/ p>

//MSDN Example
var query =
contacts.SelectMany(
    contact => orders.Where(order =>
        (contact.ContactID == order.Contact.ContactID)
            && order.TotalDue < totalDue)
        .Select(order => new
        {
            ContactID = contact.ContactID,
            LastName = contact.LastName,
            FirstName = contact.FirstName,
            OrderID = order.SalesOrderID,
            Total = order.TotalDue
        }));

但是,遗憾的是,DomainServices无法返回未定义的类型,因此这种方式无效。

方式#2:我找到了下一个解决方案 - 制作单独的DTO类(DataTransferObject)。我刚读了一些样本,并在下一课的服务器端制作:

[DataContract]
public partial class CustomerDTO
{
    [DataMember]
    public int ISN { get; set; }
    [DataMember]
    public string FIO { get; set; }
    [DataMember]
    public string Listeners { get; set; }
}

基于这个类,我做了一行返回过滤数据的方法:

[OperationContract]
public List<CustomerDTO> Customers_Common()
{
     return DbContext.Customers....Select(c => new CustomerDTO { ISN = c.ISN, FIO = c.FIO, Listeners = c.Listeners }).ToList();
}

这很好,一切都很好......

但是,有一个奇怪的问题:在本地运行应用程序不会影响任何麻烦,但在网站上发布项目后,DomainService会返回每个方法HTTP 500错误(“未找到”异常) 。当然,我甚至无法登录到我的应用程序中。 DomainService已经死了。如果我从应用程序中删除最后一个类和新方法并重新发布 - 一切正常,但没有特殊过滤......

问题:我做错了什么,为什么服务因新课程而死,或者告诉我另一种解决问题的方法。请。


U P D A T E:

嘿,终于我解决了这个问题! 答案是:Dynamic query with WCF RIA Services

1 个答案:

答案 0 :(得分:1)

最好的方法是找出导致错误的原因。为此,重写DomainService上的OnError方法,如下所示:

 protected override void OnError(DomainServiceErrorInfo errorInfo)
 {
     /* Log the error info to a file. Don't forget inner exceptions.
      */

     base.OnError(errorInfo);
 }

这很有用,因为只有两个异常会传递给客户端,所以如果有很多嵌套的内部异常,你仍然应该能够看到实际导致错误的原因。

此外,您可以通过将调试器附加到要打开站点的浏览器实例来检查错误。在VS2010中,这可以通过 [Debug] - &gt;来完成。菜单栏中的 [附加到处理]

相关问题