Передайте StreamReader в службу WCF из асинхронного вызова Silverlight

StackOverflow https://stackoverflow.com/questions/1828063

Вопрос

Я хочу импортировать записи из 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

<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

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.

Спасибо!

Это было полезно?

Решение

Ни 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())
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top