上传文件时,我遇到了一个奇怪的间歇性错误,它只出现在部署服务器上
本文关键字:错误 部署 服务器 遇到 文件 一个 | 更新日期: 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,从而导致您正收到的错误。