2011-10-10 35 views
0

看起来即时通讯面临一个问题。我有.NET + Flex应用程序。C#WebServices和Flex RPC会话不起作用

我有一个Flex组件,他将一个.XLS文件上传到服务器。 该组件有一个Progress Bar,并将其与fileref.addEventListener(ProgressEvent.PROGRESS, progressHandler);

private function progressHandler(event:ProgressEvent):void 
{ 
    uploadProgress.label = "Uploading File %3%%"; 
    uploadProgress.setProgress(event.bytesLoaded, event.bytesTotal); 
} 

我用的FileReference和所有的事情acomplish此更新其栏和标签。我在服务器中发布文件的东西保存这样

HttpFileCollection uploadedFiles = Request.Files; 
string path = string.Empty; 
string sFile = Request.Params["Name"]; 
if (uploadedFiles.Count != 0) 
{ 
    HttpPostedFile userPostedFile = uploadedFiles[0]; 
    if (userPostedFile.ContentLength > 0) 
    { 
    path = Server.MapPath(".\\Uploads\\") + sFile; 
    userPostedFile.SaveAs(path); 
    } 
} 

这工作完全正常,我的吧,我的标签被刷新ok了,我的文件在Temp文件夹上传并一切正常,所以回到到Flex我可以通过DataEvent.UPLOAD_COMPLETE_DATA上传文件。 因此,当调度此事件时,我调用Web服务的WebMethod来读取已发布的文件并遍历所有记录。该文件可能有65,000多行。因此,在某些表中,信息在Oracle DB中逐行更新。

我试图实现的是当文件发布到服务器时具有相同的效果。我想要一个进度条并显示上载到Oracle DB的行的百分比。

所以我在Flex中做的是这样的:

//Service is the WebService Instance 
ShowPopUpProgress(); 
Service.wsUploadFileToDb(FileName);  
Service.wsUpdatePercentage(); 

protected function wsUpdatePercentage_result(event:ResultEvent):void 
{   
    compProgress.uploadProgress.label = "Uploading to DB %3%%"; 
    compProgress.uploadProgress.setProgress(event.result.Actual,  event.result.Total); 
    if(event.result.Actual != event.result.Total) 
    { 
    Service.wsUpdatePercentage(); 
    } 
    else 
    { 
     RemovePopUpProgress(); 
    } 
} 

而在C#我这样做

[WebMethod(EnableSession = true)] 
public void wsUploadFileToDb(string fileName) 
{ 
    HttpContext.Current.Session["Total"] = 0; 
    HttpContext.Current.Session["Actual"] = 0; 
    //... And in the Loop 
    HttpContext.Current.Session["Total"] = myDataTable.Rows.Count; 
     for (int i = 0; i < myDataTable.Rows.Count; i++)     
     { 
         HttpContext.Current.Session["Actual"] = i + 1; 
     } 

} 



[WebMethod(EnableSession = true)] 
    [XmlInclude(typeof(Percentage))] 
    public Percentage wsUpdatePercentage() 
    { 
    Percentage oPercentage= new Percentage(); 
     if (HttpContext.Current.Session["Total"] != null) 
     { 
      oPercentage.Total = Convert.ToInt32(HttpContext.Current.Session["Total"]); 
      oPercentage.Actual= Convert.ToInt32(HttpContext.Current.Session["Actual"]); 
     } 
    } 

我不知道在这一点上,你明白我想做的事。我不知道这是最好的方式,还是有另一种方法来实现我的目标。但那就是我所拥有的。由于某种原因,这是行不通的,会话变量正确存储在 wsUploadFileToDb方法,但我无法看到他们在wsUpdatePercentage,他们只是不“共享”会话。我调试了这两种方法,会话ID是不同的。所以会话不被共享。我不知道还有什么要做。我在网站上的第一页是一个aspx ..我在会话中放置了一个虚拟变量,因为我在一篇文章中读到你必须这样做,在web服务中启动会话,但仍然不是运气。

任何帮助将非常感激。

在此先感谢。

回答

1

我可以建议一种替代方法;如果您维护一个单独的表,其中包含有关将数据上载到Oracle数据库的进度信息的单独表格,而不是试图在Web应用程序和服务之间共享会话信息,则会更容易。

基本上你会更新这张表,从Excel中插入到表中的每一行,并从服务中读取这个进度表中的信息并将其报告给Flex客户端。

这样,您也有一个审核日志,记录您从excel文件到数据库所做的所有上传以及有关它们是否正确成功以及导入的行数的信息。

+0

感谢您的回复,我在第一时间就想到了这一点,但我不想放慢这个过程。但是我没有在这方面看到它,有一个审计日志。让我试试看,并检查它的性能。谢谢。 –

+0

我这样做,它运行良好,它不能解决有关会话的问题......但它解决了问题。感谢:D –