Передайте StreamReader в службу WCF из асинхронного вызова Silverlight - PullRequest
1 голос
/ 01 декабря 2009

Я хочу импортировать записи из CSV-файла в БД из интерфейса Silverlight. Я использую сервис WCF для выполнения операций с БД. Когда я передаю полный путь к файлу (жестко запрограммированный), я могу добавить записи в БД, но поскольку OpenFileDialog в Silverlight не позволяет получить путь к файлу (по соображениям безопасности), я попытался использовать службу WCF и пройти либо свойство FileInfo, либо StreamReader, а затем выполните операции. Но это дает мне исключение. У меня есть следующий код -

1) Передача StreamReader Файл Page.xaml.vb

Dim service As New ServiceReference1.Service1Client
dlg.ShowDialog()
Dim Reader As System.IO.StreamReader
If dlg.File IsNot Nothing Then
   Reader = dlg.File.OpenText
End If
service.ImportPersonInfoAsync(Reader)

'Service1.svc.vb file

<OperationContract()> _
    Public Sub ImportPersonInfo(ByVal Reader As System.IO.StreamReader)
    'Code to add records to DB table
    End Sub

Я получаю исключение - удаленный сервер возвратил ошибку: NotFound (в методе EndInvoke)

Public Sub EndImportPersonInfo(ByVal result As System.IAsyncResult) Implements ServiceReference1.Service1.EndImportPersonInfo
    Dim _args((0) - 1) As Object
    MyBase.EndInvoke("ImportPersonInfo", _args, result)
End Sub

2) Передача FileInfo

Page.xaml.vb file

If dlg.File IsNot Nothing Then
   ImportFile = dlg.File
End If
service.ImportPersonInfoAsync(ImportFile)

Файл Service1.svc.vb

Public Sub ImportPersonInfo(ByVal ImportFile As System.IO.FileInfo)
    Dim Reader As System.IO.StreamReader = ImportFile.OpenText
    'Do operation
End Sub

Я получаю исключение в методе BeginInvoke - Попытка доступа к методу не удалась: System.IO.FileSystemInfo.get_Attributes ()

Может кто-нибудь помочь мне / предложить решение или лучший подход для импорта записей из csv в БД программным способом с использованием Silverlight.

Спасибо!

1 Ответ

0 голосов
/ 02 декабря 2009

Ни FileInfo, ни StreamReader не являются сериализуемыми классами, поэтому вы не можете передавать их напрямую на сервер с WCF. Один из вариантов - прочитать файл в памяти, а затем передать его службе, как показано ниже. Другой вариант - прочитать файл .csv в несколько строк (список) и передать его службе.

Dim service As New ServiceReference1.Service1
Clientdlg.ShowDialog()
Dim ms As System.IO.MemoryStream
If dlg.File IsNot Nothing Then
   Dim TheFile as Stream = dlg.File.OpenRead()
   Dim Buffer as Byte() = New Byte(10000) { }
   Dim BytesRead as Integer
   Do
      BytesRead = TheFile.Read(Buffer, 0, Buffer.Length)
      ms.Write(Buffer, 0, BytesRead)
   Loop While (BytesRead > 0)
End If
TextEnd Ifservice.ImportPersonInfoAsync(ms.ToArray())
...