上传文件时,我遇到了一个奇怪的间歇性错误,它只出现在部署服务器上

本文关键字:错误 部署 服务器 遇到 文件 一个 | 更新日期: 2023-09-27 18:13:35

我随机得到这个错误,有时会显示,有时不会!

错误:

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

有人告诉我,我超过了AppPool的内存限制,即250 MB,但我认为一旦我超过内存限制,它就会出现,并且在池停止后,它应该可以正常工作。但一周前就是这样。现在它只是随机工作数小时,并随机显示此错误!所以我希望也许有人也犯了同样的错误,并能帮助解决这个问题。

顺便说一句,这是一个共享的windows托管帐户。我和我的供应商谈过了,老实说,我认为他们在所有方面都很好(Seriously(,但除了发现这个特定的错误之外,其他方面都很出色!: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;
            }
        }
    }

N.B我的截止日期快到了,所以如果有人认为这是服务器的问题,我希望你能建议一些好的windows共享托管提供商。

N.B(2(我上传的图片不超过1MB!

N.B(3(伙计们,这是一张非常重要的纸条。该网站目前正在正常工作,没有任何错误,但你对处理上传的文件是正确的(顺便说一句,我通过提供错误消息并返回来更新该文件,以包括大小和文件类型的其他块;(但实际问题是,我使用了相同的代码、相同的网站、相同的服务器和iis设置。所以相同的应用程序,我也更新了相同的图像,但我随机得到了错误。这不可能是关于文件处理!我上传了一张105 KB大小的jpg图片。总有一天它会起作用,但总有一日它不会起作用!但是,你处理文件的方式是完全正确的,我已经听从了你的建议,因为这是我的系统中的一个缺陷,但这不是问题的原因。我真希望事情能这么简单!

结论:

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

非常感谢你抽出时间。我希望这个问题能有所帮助,我不知道这是否是IE中的一件著名的事情,但对我来说,我认为这很奇怪,我相信其他人也在关注同样的问题!

上传文件时,我遇到了一个奇怪的间歇性错误,它只出现在部署服务器上

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对象之前对其进行一些验证

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

jdavies对您的问题说得很对,但可能没有清楚地理解。

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

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