【问题标题】:I have a weird and strange intermittent error when uploading files and it only appears on the deployment server?上传文件时出现奇怪而奇怪的间歇性错误,它只出现在部署服务器上?
【发布时间】:2011-11-04 09:22:11
【问题描述】:

我随机收到此错误,有时显示有时不显示!

错误:

现在它消失了:S!但它会在接下来的几个小时内出现! 简单地说,它表明参数化查询需要一个未提供的参数“@PorfilePic”,尽管它已提供并且网站在本地工作并且也在服务器上工作。我不更改代码,提供商不更改任何设置。

有人告诉我,我超过了 AppPool 的内存限制 250 MB,但我认为它应该会在我超过之后出现,并且在池休息后它应该可以正常工作。但这是一周前的情况。现在它只是随机工作数小时并随机显示此错误!所以我希望也许有人遇到同样的错误并可以帮助解决它。

顺便说一句,这是一个共享的 Windows 主机帐户。我和我的供应商谈过,老实说,我认为他们在所有方面都很好(Seriosuly),但除了发现这个特定错误之外的所有方面! :D

守则:

.Aspx Page:

<li>
    Profile Picture:
    <asp:FileUpload ID="ProfilePic_Upld" runat="server" ViewStateMode="Enabled" /><br />
</li>

文件背后的代码:

if (ProfilePic_Upld.HasFile)
{
    string fileType = ProfilePic_Upld.PostedFile.ContentType;

    if (fileType == "image/bmp" || fileType == "image/gif" || fileType == "image/jpeg" || fileType == "image/png")
    {
        if (ProfilePic_Upld.PostedFile.ContentLength <= 10485760)
        {
            string ppFileName = ProfilePic_Upld.PostedFile.FileName;
            string savedFileName = newCruise.Name + "_pp" + ppFileName.Substring(ppFileName.IndexOf('.'));
            string cruisePpUploadPath = Server.MapPath(ConfigurationManager.AppSettings["cruisesPpUploadPath"].ToString());
            ProfilePic_Upld.SaveAs(cruisePpUploadPath + savedFileName);
            newCruise.ProfilePic = savedFileName;
        }
    }
}
else
{
    newCruise.ProfilePic = "default.jpeg";
}

Web.config(ApplicationSettings 部分):

<appSettings>
<add key="cruisesPpUploadPath" value="~\resouces\cruises\cruise_pp\" />
<add key="cruisesDpUploadPath" value="~\resouces\cruises\cruise_dp\" />
<add key="cruisesClUploadPath" value="~\resouces\cruises\cruise_cl\" />
<add key="cruiseItinerariesPpUploadPath" value="~\resouces\cruises\itineraries\iti_pp\" />
<add key="cruiseItinerariesMapsUploadPath" value="~\resouces\cruises\itineraries\iti_maps\" />
<add key="cruiseReviewDocumentsUploadPath" value="~\resouces\cruises\reviews\" />

</appSettings>

邮轮舱(newCruise)

public class Cruise
{
    public int ID
    { get; set; }

    public string Name
    { get; set; }

    public int CountryID
    { get; set; }

    public string ProfilePic
    { get; set; }

    public string Description
    { get; set; }

    public int OfficialRate
    { get; set; }

}

用于创建新巡航的 DAL 方法

    public static int AddNewCruise(Cruise NewCruise)
    {
        string commandText = "INSERT INTO Cruises (Name, CountryID, ProfilePic, Description, OfficialRate) VALUES (@Name, @CountryID, @ProfilePic, @Description,  @OfficialRate); SELECT scope_identity();";
        int newCruiseId;

        Cruise newCruise = NewCruise;
        string name = newCruise.Name;
        int countryId = newCruise.CountryID;
        string profilePic = newCruise.ProfilePic;
        string desc = newCruise.Description;
        int officialRate = newCruise.OfficialRate;

        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            using (SqlCommand command = new SqlCommand(commandText, connection))
            {
                command.Parameters.AddWithValue("@Name", name);
                command.Parameters.AddWithValue("@CountryID", countryId);
                command.Parameters.AddWithValue("@ProfilePic", profilePic);
                command.Parameters.AddWithValue("@Description", desc);
                command.Parameters.AddWithValue("@OfficialRate", officialRate);

                connection.Open();

                newCruiseId = Convert.ToInt32(command.ExecuteScalar());


                return newCruiseId;
            }
        }
    }

注意,我的截止日期快要到期了,所以如果有人认为这是服务器的问题,我希望你能推荐一些好的 Windows 共享主机提供商。

注意 (2) 我上传的图片不超过 1 MB!

N.B (3) 伙计们,这是一个非常重要的注意事项。该网站现在可以正常工作,但是您对处理上传的文件是正确的(顺便说一句,我更新为包含大小和文件类型的 else 块,如果条件通过提供错误消息然后返回;)但是实际问题是我使用相同的代码、相同的网站、相同的服务器和 iis 设置。所以相同的应用程序,我也更新了相同的图像,但我随机收到错误。这不可能是关于文件处理的!我上传了大小为 105 KB 的 jpg 图像。一天有效,一天无效!所以但是你处理文件是完全正确的,我已经听从了你的建议,因为这是我系统中的一个缺陷,但这不是问题的原因。我真希望它可以这么简单!

结论:

首先,问题是我在使用 Firefox 的个人 PC 上进行开发时进行测试,然后我和客户在我们使用 Internet Explorer 的商务 PC 上跟进工作。问题在于没有处理大小和类型这两个条件,所以我不接受上传的文件但我仍然调用数据库方法,所以这是第一步。然后我只是按照建议并在任何条件不满足时返回,所以我将同一张图片上传到我的应用程序的两个不同实例(一个从 IE 打开,另一个从 FireFox 打开)。 Firfox 上传正常,但 IE 现在显示类型错误。我做了一些研究,结果发现 IE 将 jpg 和 png 作为渐进类型(PJPEG 和 X-PNG)接收,因此通过添加我的类型条件 image/jpeg 和 image/x-png 一切正常。

感谢您的宝贵时间,非常感谢 =)。我希望这个问题有所帮助,如果这是 IE 中的一个著名事物,我不知道,但对我来说,我认为这很奇怪,我相信其他人正在研究同样的问题!

【问题讨论】:

  • 谁投票支持我的问题,如果你有同样的错误,我们应该谈谈! :S lol .. 伙计们,你能相信我已经在这个神话中生活了一个多星期!
  • 你能用准确的消息和堆栈跟踪发布整个异常吗?您的代码中的 newCruise 是什么?
  • 您提到错误在@PorfilePic 附近 - 但没有显示似乎与此相关的代码......?
  • 代码似乎与给出的微小错误信息无关。我认为无论谁赞成这个问题都没有阅读它。
  • 好的 newCruise 是我班级的一个对象,@ProfilePic 是 DAL 查询中的参数。无论如何,我现在将添加类代码和 DAL 方法。我同意 Andrew,我认为它与代码无关,因为它工作然后停止,然后出现! ..我现在无法发布确切的错误,因为遗憾的是它现在正在工作。但是,每当我再次收到错误时,我都会尝试将其包含在内,或者我会尝试找到我为错误拍摄的屏幕截图。

标签: c# asp.net visual-studio-2010 sql-server-2008


【解决方案1】:

It states that the parametrized query need a parameter '@PorfilePic' which was not supplied1

这对我来说,表明您正在将上传文件的名称/路径存储到数据库中,并且它尝试插入的值(当时)是一个空字符串。

编辑

看代码,如果文件类型或文件大小条件不满足,那么有可能newCruise.ProfilePic不会被设置,导致可能出现空引用。

(如果没有 newCruise 类的代码,很难分辨。)

if (fileType == "image/bmp" || fileType == "image/gif" || fileType == "image/jpeg" || fileType == "image/png")
{
    if (ProfilePic_Upld.PostedFile.ContentLength <= 10485760)
    {

编辑

基于您的 DAL 代码。我上面描述的事情绝对有可能发生。

如果文件类型不符合你的条件或者文件太大,代码会导致上面提到的异常。 (如果,不管条件结果如何,都会调用AddNewCruise方法)

我建议在持久化 Cruise 对象之前对其进行一些验证。

如果上面的文件类型和大小条件不满足,至少你不应该调用AddNewCruise方法,而不提供一些默认值(例如newCruise.ProfilePic = "default.jpeg";)。

【讨论】:

  • 很抱歉,这个问题对我来说非常复杂,所以我忘了包括一些重要的细节。无论如何,我使用的机制是将目录存储在 web.config AppSettings 部分,并将文件名存储在数据库中。实际上它在本地工作正常,所以我不认为 DAL 没有获取 FileName,PL 也没有正确发送或读取 FileName。但也许我的内存或执行时间用完了,所以它是代码的一部分或其他东西,最终以空值结束。因为如您所见,如果 FileUpload 为空,它会将其设置为默认值
  • 这意味着如果值为null,那么它通过了检查FileUpload控件是否有文件的If语句,那么就会出现上传问题。
  • 好的,但我确定文件类型和大小(根据我的新笔记)。我已经更新了我的问题。另请注意,我已经在本地调试了这个应用程序,它工作得很好。
  • 关于您上次的编辑,我不认为这可能是原因,但我完全同意您的观点,我相信这会让我在未来面临问题。所以我会尝试更新我的 PL 并研究内存泄漏,因为每个人都认为可能是这种情况!
  • @lKashef 我不知道那个“每个人”会是谁......但你在这里似乎有一个比模糊的“内存泄漏”更清楚的问题,这极不可能导致你得到的例外。
【解决方案2】:

jdavies 对您的问题的看法是正确的,但可能没有清楚地表达出来。

它与服务器内存泄漏或限制无关,与生产/开发无关。

这是因为当有人上传不是图像的文件时,你没有正确处理这种情况。在这种情况下,您永远不会将 profile pic 属性设置为任何值。因此,它为 null,从而导致您收到的错误。

【讨论】:

  • 其实没那么复杂:在你的代码中找到一个没有设置个人资料图片路径或者设置为空的路径。这与应用程序池内存限制无关
  • 顺便说一句;您的代码有更多缺陷......例如,如果有人上传与现有文件同名的文件,则无法正确处理。
  • 好的,如何调试已经部署的网站?当我在本地机器上运行网站时,它永远不会产生这个错误!关于缺陷,我真的不是那么好,所以我是你指点我这些点,但是对于重复文件名的这个特定点,如果你检查你会看到我将保存的文件命名为输入的邮轮名称,我限制为唯一。
  • 首先,您需要从准确完整错误报告开始。服务器上没有记录错误吗?不要告诉我看到 asp.net 原始错误屏幕的用户是您唯一的调试工具...
  • 我很确定您没有在适当的时间检查您的唯一约束......但这只是我目前所见的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2015-04-06
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多