0

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

我由此制作的数据库中的常见加载数据:

return DbContext.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 有一个漂亮的投影方法:

//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 错误(“未找到”异常)。当然,我什至不能登录到我的应用程序。域服务已死。如果我从应用程序中删除最后一个类和新方法并重新发布 - 一切正常,但没有特殊过滤......

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


更新 :

嘿,我终于解决了这个问题!有一个答案:使用 WCF RIA 服务进行动态查询

4

1 回答 1

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] -> [Attach to Process]来完成的。

于 2013-04-29T19:08:24.407 回答