如何解决.NET网站问题

时间:2014-05-14 16:16:01

标签: asp.net entity-framework

我试图找出导致.NET 4.0网站有时挂起或处理缓慢的原因。

任何给定页面(及其相关代码)似乎运行正常或功能一般,甚至在它们刚刚工作时可以快速地接受。但是,偶尔,任何给定的页面加载只会坐下来旋转......但最终会完成。这是在本地ISP的专用服务器上。还有许多其他网站在运行(完全是经典的ASP网站,除了这一个)。其他站点通常在.NET站点挂起时响应正常。大部分服务器活动来自我们主站点上的ASP论坛(Snitz)。在.NET挂起期间,它似乎根本不会变慢。 此外,在有问题的网站的子目录中有一个Snitz论坛,并在同一个应用程序池中运行。大多数情况下,当.NET页面挂起时,我没有看到它出现问题。还在进一步验证。

如果我观看任务管理器,服务器在任何此期间似乎都不会被征税。

基本上,我可以使用哪种资源来解决这个问题? 这些代码听起来像我需要调查或简化? 如果不在这里,我应该寻找其他地方的故障排除方法? (希望我能在最合适的Stack论坛中找到它。)

我不确定最终可能需要哪些细节,但这里有一点点,没有分发整个网站的所有代码。

•服务器信息:Windows Server 2003,IIS 6.0,SQL Server 2005(9.0)

•使用C#Code-Behind;实体框架; LINQ to EF,以及LINQ to object和一些SQLDataSource控件的一些内容;一些用户控件;成员资格和角色,但不是配置文件,我将成员资格数据手动(使用EF或SQL)与同一数据库中的其他用户数据以及论坛的用户数据捆绑在一起;我有一个来自ReCaptcha和Stripe的DLL,虽然它们都没有使用过。

•从Google的API,Google Analytics和其他1个本地JS文件中调用1个webfont和jQuery;以及1-2个本地CSS文件。

•1个.NET站点及其所有数据的数据库;和1个论坛数据库;每个数据库都有一个单独的EF模型。

•我在网站上使用SSL。我并不需要它,但是一旦有人登录,我会尽可能地指导它(被动地,特别是当涉及到管理员,个人资料或交易页面时)。

•我在Global.asax中有一个函数,可以在发生错误时向我发送错误。我没有收到任何关于这些挂起的错误消息。

•我有外部监视器(Monitis)每分钟对此站点,我们的主站点以及我们也租用的单独Apache虚拟服务器上的站点执行HTTP检查;以及ping这个服务器,Apache服务器和我们业务的本地网络路由器。 HTTP检查设置为5秒超时。我几乎从未听过ping,但我得到了平均值。 14个HTTP失败/天,但不是从一个服务器或从一个站点始终如一 - 尽管Apache服务器最近很安静,而且有问题的站点更有问题。

•在上周,我使用了JetBrains' dotTrace,以及SQL Server Profiler的跟踪工具。对于SQL,我不太了解要寻找什么,但唯一让我感到惊讶的是,主要的Snitz论坛是更多的请求;我在测试时会进行大量的登录和注销;它的许多请求都是双三位数毫秒。对于我在dotTrace中看到的情况,最麻烦的似乎与登录有关,但它也表明其他过程有时需要更长时间。通常,LINQ查询的一些递归部分是大部分时间。

•我已经从Visual Web Developer 2010本地运行.NET站点进行测试。它连接到实时数据库,而不是测试数据库。我没有注意到它有问题。但是,它不使用SSL(可能很明显)。需要针对任何问题进一步测试。

•我没有实施任何存储过程。我认为这可能是第一件尝试的事情。

•它似乎不是垃圾邮件发送者或机器人或者这样会减慢网站速度。我一直在采取措施,阻止我们的主站点和.NET站点的表单中的垃圾邮件发送者。

通过实际代码:相对于dotTrace有时指出的登录过程,以及我将会员资格与我自己的数据捆绑在一起的地方的示例,这是来自登录页面,我在这里; m使用LoginView控件。我忽略了它上面的15行,与Master页面中的Page指令和Content占位符相关,并且在结束之前忽略了5行:

<asp:LoginView Id="LoginView1" runat="server">
    <AnonymousTemplate>
        <asp:Login ID="UserLogin" runat="server" CssClass="FrontEndForm MembershipControl" FailureText="We were unable to log you in. Please check your username and password, and try again." onloggedin="UserLogin_LoggedIn">
            <LayoutTemplate>
                <p class="FailureText"><asp:Literal ID="FailureText" Runat="server" EnableViewState="false"></asp:Literal></p>
                <div id="LoginUsernameContainer" class="FieldGroup clearfix">
                    <label for="UserName" class="FieldLabel">Username</label>
                    <asp:TextBox ID="UserName" runat="server" CssClass="FieldControl FieldTextBox" Text="" MaxLength="256"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="UserNameValidator" runat="server" ControlToValidate="UserName" CssClass="Validation FieldValidation" Text="*" ValidationGroup="LoginFields"></asp:RequiredFieldValidator>
                </div>
                <div id="LoginPasswordContainer" class="FieldGroup clearfix">
                    <label for="Password" class="FieldLabel">Password</label>
                    <asp:TextBox ID="Password" runat="server" CssClass="FieldControl FieldTextBox" Text="" MaxLength="128" TextMode="Password"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="PasswordValidator" runat="server" ControlToValidate="Password" CssClass="Validation FieldValidation" Text="*" ValidationGroup="LoginFields"></asp:RequiredFieldValidator>
                </div>
                <div class="FieldGroup clearfix">
                    <label for="RememberMe" class="FieldLabel">Remember me next time:</label>
                    <asp:CheckBox ID="RememberMe" runat="server" CssClass="FieldControl FieldCheckBox"></asp:CheckBox>
                </div>
                <div id="LoginButtonContainer" class="FieldGroup ButtonContainer clearfix">
                    <asp:Button ID="Login" runat="server" CommandName="Login" CssClass="SubmitBtn" Text="Log In" ValidationGroup="LoginFields" />
                    <a href="/password_reset.aspx" class="caption">Forgot your password?</a>
                </div>
                <div id="LoginJoinContainer" class="FieldGroup clearfix">
                    Not yet a member? <a href="/membership.aspx">Join <asp:Literal ID="JoinUsCompanyName" runat="server" Text="<%$ AppSettings:CompanyName %>"></asp:Literal> today!</a>
                </div>
            </LayoutTemplate>
        </asp:Login>
    </AnonymousTemplate>
    <LoggedInTemplate>
        You are already logged in.
    </LoggedInTemplate>
</asp:LoginView>

代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MyEntityModel;

public partial class _login : MyMain
{
    protected void Page_PreInit(object sender, EventArgs e)
    {
        if (Request.IsSecureConnection.Equals(false) && Request.IsLocal.Equals(false))
        {
            Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"] + HttpContext.Current.Request.RawUrl);
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            MyNamespace.exclude ExcludeVisitor = new MyNamespace.exclude();

            if (ExcludeVisitor.Yes)
            {
                LoginView1.Visible = false;
            }
        }
    }

    protected void UserLogin_LoggedIn(object sender, EventArgs e)
    {
        using (MyEntities MyEntity = new MyEntities())
        {
            Login UserLogin = (Login)LoginView1.FindControl("UserLogin");
            var _NetUser = (from u in MyEntity.aspnet_Users
                                            where u.LoweredUserName == UserLogin.UserName.ToLower()
                                            select new 
                                            {
                                                UserName = u.UserName,
                                                Password = u.aspnet_Membership.Password
                                            }).SingleOrDefault();
            if (_NetUser != null)
            {
                HttpCookie SnitzCookie = new HttpCookie("Snitz01User");
                SnitzCookie["Password"] = Server.UrlEncode(_NetUser.Password.ToString());
                SnitzCookie["UserName"] = Server.UrlEncode(_NetUser.UserName.ToString());
                SnitzCookie.Path = "/";
                Response.Cookies.Add(SnitzCookie);
            }
        }
    }
}

作为参考,上面的LINQ查询正在搜索&lt; 50位用户。

更新:

到目前为止,我没有看到任何使用Perfmon的东西看起来完全没有打击,除了这一点点 - 在加载页面时观看ASP.NET v4.0 /请求执行时间,我看到它拖累在页面完成加载后很久。我加载页面,执行时间跳到一些数字,页面结束(在我的浏览器中),但我看到该行继续在Perfmon中维持。这可以采取几种方式:如果我坐下来观看,有时它会在10秒内回落到0,有时它会在一段时间内(比如半分钟或更长时间)回落到0;或者如果我在页面仍然未归零的情况下重新加载页面,则该行立即降至0,并且执行时间再次开始。通常情况下,任何紧接着的后续重新加载都会有一个短暂的尖峰执行时间,并在页面完成后立即回落到0 - 没有延续。 (刚发生在我身上,我应该测试维持是否发生在&#34;新的&#34;页面请求,从不刷新,或者它是否混合且独立于此。)

无论如何,这持续的执行时间意味着什么?我该怎么做才能找出可能仍在执行的内容? (我想从构建一个新的,简单的页面开始,看看它是否仅在基本模板中发生,并且正在使用......)

否则,我仍然怀疑.NET Membership的使用是不可靠的,并且我开始发现我可以检查的事情(比如.NET的存储过程等)以获取不必要的步骤和过程。但是&#34;维持&#34;上面的问题似乎独立于.NET Membership。

更新2: 为了解决松散的问题,似乎大多数问题都与我们大多数网站的硬盘驱动器上的错误有关。无论出于何种原因,这个新的.NET网站显示了最多的问题,但似乎并没有出现问题。

许多其他问题似乎来自我们的ISP收到垃圾邮件的问题。这很难说。我的外部监视器ping和HTTP请求站点经常报告超时(5-7秒后),但ISP很少见到任何东西;当他们这样做时,它要么与硬盘驱动器有关,要么失败&#34; (有错误)或某些消息来源阻止我们的网站。

我仍然怀疑我的创作如何能够处理繁忙的交通;我仍然怀疑它所装的硬盘是否坚固;但是现在该网站不再是一个问题 - 在磁盘清理之后,并且有一段时间观察其结果。

0 个答案:

没有答案