使用IIS在服务器上发布asp.net网站

本文关键字:asp net 网站 IIS 服务器 使用 | 更新日期: 2023-09-27 18:18:01

我已经创建了一个网站。这是一个登录页面,它在调试上工作得很好,但是当我在服务器上部署它时,我得到了一个奇怪的错误。当我点击登录时,我得到了这个错误:

     Invalid column name 'aa'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'aa'.
Source Error:

Line 33: 
Line 34:                 DataSet ds = new DataSet();
Line 35:                 dataAdapter.Fill(ds);
Line 36:                 DataTable dt = ds.Tables[0];
Line 37: 

Source File: c:'inetpub'wwwroot'login.aspx.cs    Line: 35
Stack Trace:

[SqlException (0x80131904): Invalid column name 'aa'.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +388
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +717
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4515
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +134
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6557689
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) +6560327
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +586
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +104
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +288
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +171
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +15
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +325
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +420
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +275
   login.ValidateUser(Object sender, EventArgs e) in c:'inetpub'wwwroot'login.aspx.cs:35
   System.Web.UI.WebControls.Login.AttemptLogin() +160
   System.Web.UI.WebControls.Login.OnBubbleEvent(Object source, EventArgs e) +93
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +84
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3804

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.342

正如我所期望的,它必须表示错误的登录,但它显示了这个错误。下面是我的代码:

 protected void ValidateUser(object sender, EventArgs e)
{
    int userId = 0;
    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constr))
    {
        string query = "SELECT [OBJECTID] from dbo.OWNER where [owner_id]=" + Login1.UserName;
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(query, con))
        {
            con.Open();

            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

            DataSet ds = new DataSet();
            dataAdapter.Fill(ds);
            DataTable dt = ds.Tables[0];
            userId = Convert.ToInt32(dt.Rows[0][0]);
            if (userId.ToString() != Login1.Password)
            {
                userId = -1;
            }
            con.Close();
        }
        switch (userId)
        {
            case -1:
                Login1.FailureText = "نام کاربری یا کلمه عبور صحیح نیست";
                break;
            case 0:
                Login1.FailureText = "نام کاربری یا کلمه عبور صحیح نیست";
                break;
            case -2:
                //Login1.FailureText = "Account has not been activated.";
                break;
            default:
                FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet);
                break;
        }
    }

,下面是web.config文件中的数据库连接:

    <connectionStrings>
    <add name="constr" connectionString="Data Source=XXX.xxx.xxx.xxx'sqlexpress;Initial Catalog=land_gis;Persist Security Info=True;User ID=Land;Password=password"/>

你认为是数据库连接的问题吗?我可以用这个连接运行我的调试,没有问题,但是当我把它们复制到wwwroot时,它会出现问题。我应该在IIS中添加数据库之类的吗?

非常感谢你的帮助

使用IIS在服务器上发布asp.net网站

除非Login1。UserName是一个数字,这在dev中也行不通。您的查询没有正确地参数化,并且您没有引号,因此查询将读取SELECT [OBJECTID] from dbo.OWNER where [owner_id]=aa(假设您在用户名框中输入"aa")。

如果你尝试运行这个查询,它会认为aa是一个列名,而不是一个真实的值。

参数化你的查询,你应该没问题。

编辑

不知何故,我没有找到一个好的,简短的,简单的教程,在c#中使用参数化查询。简单来说就是:

在编写查询时,将变量作为稍后传入的值的占位符。当您在c#中执行命令时,您将填充这些变量。这使您的代码免受SQL注入(有人通过向您的查询中注入SQL语句来执行不需要的脚本),这也意味着您不必担心所有的引号。

在c#中,使用数据集的方式,它看起来像:

using (var con = new SqlConnection(constr))
{
    con.Open();
    string query = "SELECT [OBJECTID] from dbo.OWNER where [owner_id] = @OwnerID";
    using (var com = new SqlCommand(query, con))
    {
        com.Parameters.AddWithValue("@OwnerID", Login1.UserName);
        using (var da = new SqlDataAdapter(com))
        {
            var ds = new DataSet();
            da.Fill(ds);
            Console.WriteLine(ds.Tables[0].Rows[0][0]);
        }
    }
}

相同的代码有几十种编写方法(不同的构造函数,不同的检索数据的方法等),但重要的是永远不要允许用户直接输入到查询的文本中,而是将参数附加到查询中。

您的连接似乎工作正常,因为它说在堆栈跟踪中无效的列名'aa'。但是你的查询没有这一列。它只有OBJECTID

如果您出于某种原因在查询中添加了aa列,并且部署了带有该错误的代码,则可能发生这种情况。