Pass Stream zu WCF-Dienst von Silverlight Async Anruf
-
11-09-2019 - |
Frage
Ich möchte von Silverlight-Frontend der DB Datensätze aus CSV-Datei importieren. Ich bin mit WCF-Dienst, um die DB-Operationen auszuführen. Wenn ich die gesamte Dateipfad (hart codiert) passieren, bin ich in der Lage Datensätze an die DB hinzuzufügen, aber als Openfile in Silverlight erlaubt es nicht, den Dateipfad des (aus Sicherheitsgründen) zu erhalten, habe ich versucht, WCF-Dienst und den Ball mit entweder die Fileinfo-Eigenschaft oder Stream und führen Sie dann die Operationen. Aber sein gibt mir eine Ausnahme. Ich habe den folgenden Code -
1) Passing Stream Page.xaml.vb Datei
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 Datei
<OperationContract()> _
Public Sub ImportPersonInfo(ByVal Reader As System.IO.StreamReader)
'Code to add records to DB table
End Sub
Ich erhalte eine Ausnahme - Der Remoteserver hat einen Fehler zurückgegeben: NotFound (in EndInvoke Methode)
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) Passing Fileinfo
Page.xaml.vb Datei
If dlg.File IsNot Nothing Then
ImportFile = dlg.File
End If
service.ImportPersonInfoAsync(ImportFile)
Service1.svc.vb Datei
Public Sub ImportPersonInfo(ByVal ImportFile As System.IO.FileInfo)
Dim Reader As System.IO.StreamReader = ImportFile.OpenText
'Do operation
End Sub
Ich erhalte eine Ausnahme in BeginInvoke-Methode - Versuch, die Methode für den Zugriff fehlgeschlagen: System.IO.FileSystemInfo.get_Attributes ()
Kann mir jemand bitte helfen Sie mir / vorschlagen Lösung oder einen besseren Ansatz Datensätze aus csv in den DB programmatisch mit Silverlight zu importieren.
Danke!
Lösung
Weder noch Fileinfo Stream sind serialisierbar Klassen, so können sie wirklich nicht direkt mit WCF an den Server übergeben. Eine Option ist die Datei im Speicher zu lesen, es dann an den Dienst übergeben, so etwas wie unten gezeigt. Eine weitere Option ist die CSV-Datei in mehreren Zeilen lesen (List) und übergibt es an den Service.
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())