C # WebServices и Flex RPC Session не работают - PullRequest
0 голосов
/ 11 октября 2011

смотри я сталкиваюсь с проблемой.У меня есть приложение .NET + Flex.

У меня есть компонент во 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 и все остальное, чтобы выполнить это.Я сохраняю опубликованный файл на сервере примерно так:

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);
   }
}

Это прекрасно работает, мой бар и мой ярлык обновляются нормально, мой файл загружен в папку Temp и все в порядке, так чтоВозвращаясь к Flex, я могу слушать, когда файл был загружен через DataEvent.UPLOAD_COMPLETE_DATA.Поэтому, когда отправляется это событие, я вызываю WebMethod моего WebService, чтобы прочитать этот опубликованный файл и выполнить итерацию по всем записям.Файл может иметь более 65 000 строк.Таким образом, информация обновляется строка за строкой в ​​БД Oracle в некоторых таблицах.

То, что я пытаюсь архивировать, - это то же самое, когда Файл публикуется на сервере.Я хочу иметь индикатор выполнения и показывать% строк, загруженных в базу данных Oracle.

Итак, то, что я сделал во 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"]);
        }
    }

Я не знаю, если в этот момент вы понимаете, что я хочу сделать.Я не знаю, является ли это лучшим способом, или есть другой способ достигнуть своей цели.Но это то, что у меня так далеко.И по какой-то причине это не работает, переменные Session правильно хранятся в методе wsUploadFileToDb, но я не вижу их в wsUpdatePercentage, они просто не «разделяют» сеанс.Я отлаживал оба метода, и идентификатор сеанса отличается.Так что сессия не передается.Я не знаю, что еще делать.Моя первая страница на сайте - aspx. Я поместил фиктивную переменную в сеанс, потому что я прочитал в одном посте, что вы должны были это сделать, чтобы начать сеанс в веб-сервисах, но все же не повезло.

Любая помощь будет очень признателен.

Заранее спасибо.

1 Ответ

1 голос
/ 11 октября 2011

Я могу предложить альтернативный подход;вместо того, чтобы пытаться делиться информацией о сеансе между веб-приложением и службой, было бы проще, если бы вы поддерживали отдельную таблицу, в которой хранится информация о ходе загрузки данных в базу данных Oracle.

По сути, выобновляя эту таблицу для каждой строки, вставляемой в таблицу из Excel, и из службы вы можете прочитать информацию из этой таблицы прогресса, чтобы сообщить о ней клиенту Flex.

Таким образом, у вас также есть журнал аудита всех загрузок, которые вы сделали из файлов Excel в базу данных, и информация о том, успешно ли они выполнены, и количество импортированных строк.

...