asp.net/EntityFramework-为什么我的应用程序池崩溃? [英] asp.net / EntityFramework - Why does my application pool crashes?

查看:95
本文介绍了asp.net/EntityFramework-为什么我的应用程序池崩溃?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to add a new method to my API.

该方法的目标是返回在其预置位中具有给定PrestationPartenaires列表.

The method's goal is to return a list of Partenaires having the given Prestation in their prestations.

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

When I'm calling the method by a GET request, the application pool of my API crashes. In the event logs, I have a warning called Microsoft-Windows-WAS and the linked error is:

为应用程序池"UphairApi2"提供服务的进程与Windows Process Activation Service发生致命的通信错误.进程ID为"3960".数据字段包含错误号.

A process serving application pool 'UphairApi2' suffered a fatal communication error with the Windows Process Activation Service. The process id was '3960'. The data field contains the error number.

并且网络开发人员工具说它无法加载响应数据.

And the network developer tool says that it failed to load response data.

无法加载响应数据

Failed to load response data

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

When I'm returning return db.Partenaires.Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value)).ToString();, here's the returned request:

"SELECT \ r \ n Extent1.IdPartenaire,\ r \ n Extent1.FirstName,\ r \ n Extent1.LastName,\ r \ n Extent1.Email,\ r \ n Extent1.Password,\ r \ n Extent1.PasswordSalt,\ r \ n Extent1.Type,\ r \ n Extent1.Pays ,\ r \ n Extent1.Ville,\ r \ n Extent1.CodePostale,\ r \ n Extent1.Adresse,\ r \ n Extent1.Lat,\ r \ n Extent1.Lng,\ r \ n Extent1.ImageUrl,\ r \ n Extent1.CouvertureUrl,\ r \ n Extent1.DateNaissance,\ r \ n Extent1.ADomicile,\ r \ n Extent1.SeDeplace,\ r \ n Extent1.DateAjout,\ r \ n Extent1.AdresseComplement,\ r \ n Extent1.TelMobile,\ r \ n Extent1.ValidationAutomatique,\ r \ n Extent1.NotifEmailMessage,\ r \ n Extent1.NotifEmailReservation,\ r \ n Extent1 .NotifEmailPaiement,\ r \ n Extent1.NotifEmailNewsletter,\ r \ n Extent1.NotifSmsMessage,\ r \ n Extent1.NotifSmsReservation,\ r \ n Extent1.IdUserMango,\ r \ n Extent1.Iban,\ r \ n Extent1.TitulaireCompte,\ r \ n Extent1.IdWallet,\ r \ n Extent1.IdAccount ,\ r \ n Extent1.Valide,\ r \ n Extent1.Son,\ r \ n Extent1.Push,\ r \ n Extent1.IdPhone \ r \ nFROM Partenaire AS Extent1 \ r \ n存在(SELECT \ r \ n1 AS C1 \ r \ nFROM PartenairePrestation AS Extent2内连接Prestation AS Extent3 ON Extent2. IdPrestation = Extent3.IdPrestation \ r \ n其中(Extent1.IdPartenaire = Extent2.IdPartenaire)AND(((Extent3.NomPrestation = @ p__linq__0)或((( Extent3.NomPrestation IS NULL)AND(@ p__linq__0 IS NULL))))"

"SELECT\r\nExtent1.IdPartenaire, \r\nExtent1.FirstName, \r\nExtent1.LastName, \r\nExtent1.Email, \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\nExtent1.TelMobile, \r\nExtent1.ValidationAutomatique, \r\nExtent1.NotifEmailMessage, \r\nExtent1.NotifEmailReservation, \r\nExtent1.NotifEmailPaiement, \r\nExtent1.NotifEmailNewsletter, \r\nExtent1.NotifSmsMessage, \r\nExtent1.NotifSmsReservation, \r\nExtent1.IdUserMango, \r\nExtent1.Iban, \r\nExtent1.TitulaireCompte, \r\nExtent1.IdWallet, \r\nExtent1.IdAccount, \r\nExtent1.Valide, \r\nExtent1.Son, \r\nExtent1.Push, \r\nExtent1.IdPhone\r\nFROM Partenaire AS Extent1\r\n WHERE EXISTS(SELECT\r\n1 AS C1\r\nFROM PartenairePrestation AS Extent2 INNER JOIN Prestation AS Extent3 ON Extent2.IdPrestation = Extent3.IdPrestation\r\n WHERE (Extent1.IdPartenaire = Extent2.IdPartenaire) AND ((Extent3.NomPrestation = @p__linq__0) OR ((Extent3.NomPrestation IS NULL) AND (@p__linq__0 IS NULL))))"

以及Mysql Workbench的等效项:

And the equivalent for 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. Lat,Extent1.Lng,Extent1.ImageUrl,Extent1.CouvertureUrl,Extent1.DateNaissance,Extent1.ADomicile,Extent1.SeDeplace,Extent1.DateAjout,Extent1.AdresseComplement,Extent1.TelMobile,Extent1.ValidationAutomatifE1Mail. Extent1.NotifEmailPaiement,Extent1.NotifEmailNewsletter,Extent1.NotifSmsMessage,Extent1.NotifSmsReservation,Extent1.IdUserMango,Extent1.Iban,Extent1.TitulaireCompte,Extent1.IdWallet,Extent1.IdAccount,Extent1.ValideP.来自Partenaire AS Extent1的IDPhone在哪里存在(从PartenairePrestation AS Extent2内联接中选择1 AS C1在Extent2.IdPrestation = Extent3.IdPrestation WHERE(Extent1.IdPartenaire = Extent2.IdPartenaire)和((Extent3.NomPres tation ='Barbe')))

SELECT Extent1.IdPartenaire, Extent1.FirstName, Extent1.LastName, Extent1.Email, Extent1.Password, Extent1.PasswordSalt, Extent1.Type, Extent1.Pays, Extent1.Ville, Extent1.CodePostale, Extent1.Adresse, Extent1.Lat, 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 FROM Partenaire AS Extent1 WHERE EXISTS(SELECT 1 AS C1 FROM PartenairePrestation AS Extent2 INNER JOIN Prestation AS Extent3 ON Extent2.IdPrestation = Extent3.IdPrestation WHERE (Extent1.IdPartenaire = Extent2.IdPartenaire) AND ((Extent3.NomPrestation = 'Barbe')))

我在MysqlWorkbench中测试了此请求,并且很好地返回了一组数据.

I tested this request in MysqlWorkbench and a set of datas is well returned.

这是我的方法:

// 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();
}

我在做什么错了?

任何帮助将不胜感激,因为我无法在互联网上找到其他相关主题.

Any help would be appreciated since I couldn't find another related thread on internet.

推荐答案

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

You will probably need to debug the API and specify more detail to help narrow down a cause. A couple of things I can see:

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)

The early .ToList() was required because you were attempting to compute values (NameComplet) in the Linq expression that normally would have been fed to EF which your DB provider will not understand. For efficiency, only select mapped properties, and instead change any computed values to read-only properties on your view model. (PartenaireMapItem)

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

该示例在假定名称详细信息为只读的情况下缓冲了结果.如果可以更新名字/姓氏,则只需每次返回计算出的名字即可.

That example buffers the result assuming that the name details are read-only. If First/Last name can be updated, just return the calculated name each time.

假设SeDeclace/ADomicile是字符串值而不是子实体,则其他属性应该很好. Prestations列表也是如此.可以使用Prestation名称的字符串列表.

The other properties should be fine, assuming that SeDeclace/ADomicile are string values and not child entities. The same goes for the list of Prestations. A list of strings for the Prestation names should be fine.

我所做的另一个较小更改是在返回变量之前检索视图模型以进行检查.这样可以更好地方便使用断点在返回之前检查结果.从这里确定结果计算是否返回了任何错误,或者诸如将结果视图模型序列化回客户端之类的其他信息.

The other minor change I made was to retrieve the view models in a variable to inspect prior to returning. This better facilitates using a breakpoint to inspect the results before returning. From here determine if any error is coming back from the computation of the results, or something else such as serializing the resulting view models back to the client.

这篇关于asp.net/EntityFramework-为什么我的应用程序池崩溃?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆