内存不足异常。可能来自webservice

时间:2013-04-16 02:33:48

标签: c# web-services

4个月内出现内存异常问题。我的客户使用webservice,他们想让我测试他们的web服务。在他们的web服务中,有一个函数调用上传。我在同时上传的1500个用户上测试了该功能。我尝试了visual studio(GC)的垃圾收集功能。用2mb的文件,没有异常,但是8mb的文件仍然有内存不足的例外。我已经尝试了很多次和很多解决方案,但仍然发生了。我现在要疯了。当上传正在进行时,我看了所有测试计算机的内存,但内存不存在。所以我认为问题来自webservice和服务器。但我的客户说,我必须改进从webservice和服务器到他们的原因。我现在要发疯了。你们对此有什么独处吗?另外,我们的客户端不是公共代码,我只是使用webservice的功能来测试。另外,当连接到vps时,我必须使用vps来连接他们的web服务和网络。

我必须确保我的测试脚本没有任何问题。这是我测试上传功能的测试脚本。

public void UploadNewJob(string HalID, string fileUID, string jobUID, string fileName, out List errorMessages)

{

errorMessages = null;

try

{ 

int versionNumber;

int newVersionNumber;

string newRevisionTag;

datasyncservice.ErrorObject errorObj = new datasyncservice.ErrorObject();

PfgDbJob job = new PfgDbJob();

job.CompanyName = Constant.SEARCH_CN;

job.HalliburtonSalesOffice = Constant.SEARCH_SO;

job.HalliburtonOperationsLocation = Constant.SEARCH_OL;

job.UploadPersonHalId = HalID;

job.CheckOutState = Constant.CHECKOUT_STATE;

job.RevisionTag = Constant.NEW_REVISION_TAG;

var manifestItems = new List();

var newManifestItems = new List();

var manifestItem = new ManifestItem();

if (fileUID == "")

{

if (job.JobUid == Guid.Empty)

job.JobUid = Guid.NewGuid();

if (job.FileUid == Guid.Empty)

job.FileUid = Guid.NewGuid();

}

else

{

Guid JobUid = new Guid(jobUID);

job.JobUid = JobUid;

Guid fileUid = new Guid(fileUID);

job.FileUid = fileUid;

}

// Change the next line when we transfer .ssp files by parts 

manifestItem.PartUid = job.FileUid;

job.JobFileName = fileName;

manifestItem.BinaryFileName = job.JobFileName;

manifestItem.FileUid = job.FileUid;

manifestItem.JobUid = job.JobUid;

manifestItem.PartName = string.Empty;

manifestItem.SequenceNumber = 0;

manifestItems.Add(manifestItem);

errorMessages = DataSyncService.Instance.ValidateForUploadPfgDbJobToDatabase(out newVersionNumber, out newRevisionTag, out errorObj, out newManifestItems, HalID, job, false);

if (manifestItems.Count == 0)

manifestItems = newManifestItems;

if (errorMessages.Count > 0)

{

if (errorMessages.Count > 1 || errorMessages[0].IndexOf("NOT AN ERROR") == -1)

{ 

return;

}

}

//upload new Job 

Guid transferUid;


long a= GC.GetTotalMemory(false);


byte[] fileContents = File.ReadAllBytes(fileName);

fileContents = null;

GC.Collect();

long b = GC.GetTotalMemory(false);


//Assert.Fail((b - a).ToString());

//errorMessages = DataSyncService.Instance.UploadFileInAJob(out transferUid, out errorObj, job.UploadPersonHalId, job, manifestItem, fileContents);


DataSyncService.Instance.UploadPfgDbJobToDatabase(out errorObj, out versionNumber, job.UploadPersonHalId, job, false, manifestItems);

}

catch (Exception ex)

{

Assert.Fail("Error from Test Scripts: " + ex.Message);

}

}

请查看我的测试代码。如果我的测试代码没有任何问题,我必须改进原因不是来自我的测试代码T_T

1 个答案:

答案 0 :(得分:0)

我的猜测是你达到.NET的2 GB对象大小限制(1500 * 8MB> 4GB)。
您应该考虑更改为.NET 4.5并使用大对象模式 - 请参阅here - 该设置称为gcAllowVeryLargeObjects。