Passe StreamReader para o serviço WCF de Async Chamada do Silverlight
-
11-09-2019 - |
Pergunta
Eu quero registros de importação de arquivo CSV para o DB do Silverlight extremidade dianteira. Eu estou usando o serviço WCF para realizar as operações de banco de dados. Quando eu passar todo o caminho de arquivo (codificado), eu sou capaz de adicionar registros para a DB, mas como OpenFileDialog no Silverlight não permite obter (devido a razões de segurança) do caminho do arquivo, eu tentei usar o serviço WCF e passagem quer a propriedade FileInfo ou StreamReader e, em seguida, realizar as operações. Mas a sua me dando uma exceção. Eu tenho o seguinte código -
1) Passando StreamReader arquivo 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)
'arquivo Service1.svc.vb
<OperationContract()> _
Public Sub ImportPersonInfo(ByVal Reader As System.IO.StreamReader)
'Code to add records to DB table
End Sub
Estou recebendo uma exceção - O servidor remoto retornou um erro: NotFound (no método 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) Passando FileInfo
arquivo Page.xaml.vb
If dlg.File IsNot Nothing Then
ImportFile = dlg.File
End If
service.ImportPersonInfoAsync(ImportFile)
arquivo Service1.svc.vb
Public Sub ImportPersonInfo(ByVal ImportFile As System.IO.FileInfo)
Dim Reader As System.IO.StreamReader = ImportFile.OpenText
'Do operation
End Sub
Estou recebendo uma exceção no método BeginInvoke - tentativa de acessar o método falhou: System.IO.FileSystemInfo.get_Attributes ()
Alguém por favor pode me ajudar / sugerir solução ou uma melhor abordagem para registros de importação de CSV para o programático DB usando o Silverlight.
Obrigado!
Solução
Nem FileInfo nem StreamReader são classes serializáveis, então você não pode realmente enviá-los diretamente para o servidor com WCF. Uma opção é ler o arquivo na memória, em seguida, passá-lo para o serviço, algo como mostrado abaixo. Outra opção é ler o arquivo .csv em várias linhas (lista) e passá-lo para o serviço.
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())