【问题标题】:asp.net / EntityFramework - Why does my application pool crashes?asp.net / EntityFramework - 为什么我的应用程序池崩溃?
【发布时间】:2019-01-18 01:59:27
【问题描述】:

我正在尝试向我的 API 添加新方法。

该方法的目标是返回Partenaires 的列表,其中包含给定的Prestation

当我通过 GET 请求调用该方法时,我的 API 的应用程序池崩溃。在事件日志中,我有一个名为 Microsoft-Windows-WAS 的警告,链接的错误是:

为应用程序池“UphairApi2”提供服务的进程与 Windows 进程激活服务发生了致命的通信错误。进程 ID 为“3960”。数据字段包含错误号。

网络开发者工具说加载响应数据失败。

加载响应数据失败

当我返回return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value)).ToString();,这是返回的请求:

“选择\r\nExtent1.IdPartenaire, \r\nExtent1.FirstName, \r\nExtent1.LastName, \r\nExtent1.@ 987654331@, \r\nExtent1.Password, \r\nExtent1.PasswordSalt, \r\nExtent1.Type, \r\nExtent1.Pays , \r\nExtent1.Ville, \r\nExtent1.CodePostale, \r\nExtent1.Adresse, \r\nExtent1.Lat, \ r\nExtent1.Lng, \r\nExtent1.ImageUrl, \r\nExtent1.CouvertureUrl, \r\nExtent1.DateNaissance, \r\ nExtent1.ADomicile, \r\nExtent1.SeDeplace, \r\nExtent1.DateAjout, \r\nExtent1.AdresseComplement, \r\n@ 987654364@.TelMobile, \r\nExtent1.ValidationAutomatique, \r\nExtent1.NotifEmailMessage, \r\nExtent1.NotifEmailReservation, \r\nExtent1 .NotifEmailPaiement, \r\nExtent1.NotifEmailNewsletter, \r\nExtent1.NotifSmsMessage, \r\nExtent1.NotifSmsReservation, \r\nExtent1.@ 987654381@, \r\nExtent1.Iban, \r\nExtent1.TitulaireCompte, \r\nExtent1.IdWallet, \r\nExtent1.IdAccount , \r\nExtent1.Valide, \r\n Extent1.Son, \r\nExtent1.Push, \r\nExtent1.IdPhone\r\n来自Partenaire AS Extent1\r\n \r\n1 AS C1\r\nFROM PartenairePrestation AS Extent2 INNER JOIN Prestation AS Extent3 ON Extent2.IdPrestation = Extent3.IdPrestation\r\n Extent1.IdPartenaire = Extent2.IdPartenaire) AND ((Extent3.NomPrestation = @p__linq__0) OR ((Extent3.NomPrestation IS NULL) AND (@p__linq__0 IS NULL) )))"

Mysql Workbench 的等价物:

选择 Extent1.IdPartenaire、Extent1.FirstName、Extent1.LastName、Extent1.Email、Extent1.Password、Extent1.PasswordSalt、Extent1.Type、Extent1.Pays、Extent1.Ville、Extent1.CodePostale、Extent1.Adresse、Extent1。纬度,Extent1.Lng,Extent1.ImageUrl,Extent1.CouvertureUrl,Extent1.DateNaissance,Extent1.ADomicile,Extent1.SeDeplace,Extent1.DateAjout,Extent1.AdresseComplement,Extent1.TelMobile,Extent1.ValidationAutomatique,Extent1.NotifEmailMessage,Extent1.NotifEmailReservation, Extent1.NotifEmailPaiement、Extent1.NotifEmailNewsletter、Extent1.NotifSmsMessage、Extent1.NotifSmsReservation、Extent1.IdUserMango、Extent1.Iban、Extent1.TitulaireCompte、Extent1.IdWallet、Extent1.IdAccount、Extent1.Valide、Extent1.Son、Extent1.Push、Extent1。 IdPhone 从 Partenaire 作为 Extent1 存在(选择 1 作为 C1 从 PartenairePrestation 作为 Extent2 INNER JOIN Prestation 作为 Extent3 ON Extent2.IdPrestation = Extent3.IdPrestation WHERE(Extent1.IdPartenaire = Extent2.IdPartenaire)和((Extent3.NomPres tation = '芭比')))

我在MysqlWorkbench中测试了这个请求,返回了一组数据。

这是我的方法:

// GET: api/Partenaires_prestations
        [Authorize]
        [Route("api/Partenaires_prestations")]
        public List<PartenaireMapItem> GetPartenairesWithPrestations() {

            Random rnd = new Random();

            var queryString = Request.GetQueryNameValuePairs();

            var prestation = queryString.FirstOrDefault();

            return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
                .ToList()
                .Select(p => new PartenaireMapItem {
                    IdPartenaire = p.IdPartenaire,
                    FirstName = p.FirstName,
                    LastName = p.LastName,
                    NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
                    Type = p.Type,
                    DureeMin = 50,
                    Lat = p.Lat,
                    Lng = p.Lng,
                    ImageUrl = p.ImageUrl,
                    SeDeplace = p.SeDeplace,
                    ADomicile = p.ADomicile,

                    Notes = p.NoteClientPartenaires,
                    Prestations = p.PartenairePrestations.Select(y => y.Prestation.NomPrestation).ToList();
                }).ToList();
}

我做错了什么?

任何帮助将不胜感激,因为我在互联网上找不到另一个相关主题。

【问题讨论】:

  • 有什么线索吗?我很迷茫..

标签: c# mysql entity-framework linq iis


【解决方案1】:

您可能需要调试 API 并指定更多细节以帮助缩小原因。我可以看到几件事:

var prestation = queryString.FirstOrDefault();
// Handle when prestation comes back #null. Is that valid?

var results = db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
//                .ToList() // Avoid .ToList() here... Select the entity properties you need.
    .Select(p => new PartenaireMapItem {
        IdPartenaire = p.IdPartenaire,
        FirstName = p.FirstName,
        LastName = p.LastName,
        // NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName, // Remove. Make this a computed property in your view model.
        Type = p.Type,
        // DureeMin = 50, // Can remove, can be a computed property.
        Lat = p.Lat,
        Lng = p.Lng,
        ImageUrl = p.ImageUrl,
        SeDeplace = p.SeDeplace, // Ok if a String/value. 
        ADomicile = p.ADomicile, // Ok if a String/value.

        Notes = p.NoteClientPartenaires, // Ok if a String/value.
        Prestations = p.PartenairePrestations.Select(y => y.Prestation.NomPrestation).ToList(); // Assuming this is retrieving the names of presentations. List<string>.
    }).ToList();

return results;

早期的 .ToList() 是必需的,因为您试图在 Linq 表达式中计算值 (NameComplet),这些值通常会被提供给 EF,而您的数据库提供者将无法理解。为了提高效率,只选择映射属性,而不是将任何计算值更改为视图模型上的只读属性。 (PartenaireMapItem)

private string _nomComplet = null;
public string NomComplet
{ 
    get { return _nomComplet ?? (_nomComplet = LastName.Substring(0,1).ToUpper() + ". " + FirstName); }
}

假设名称详细信息是只读的,该示例会缓冲结果。如果可以更新名字/姓氏,则每次只返回计算出来的名字。

其他属性应该没问题,假设 SeDeclace/ADomicile 是字符串值而不是子实体。 Prestations 列表也是如此。 Prestation 名称的字符串列表应该没问题。

我所做的另一个小改动是在返回之前检索变量中的视图模型以进行检查。这更好地有助于在返回之前使用断点检查结果。从这里确定是否有任何错误从结果计算中返回,或者其他错误,例如将结果视图模型序列化回客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2012-03-30
    • 2010-09-30
    • 2018-04-03
    • 2014-09-20
    • 2010-09-20
    相关资源
    最近更新 更多