【问题标题】:Pass StreamReader to WCF service from Silverlight's Async Call从 Silverlight 的异步调用将 StreamReader 传递给 WCF 服务
【发布时间】:2009-12-01 18:43:10
【问题描述】:

我想从 Silverlight 前端将 csv 文件中的记录导入数据库。我正在使用 WCF 服务来执行数据库操作。当我传递整个文件路径(硬编码)时,我可以将记录添加到数据库中,但是由于 Silverlight 中的 OpenFileDialog 不允许获取文件路径(出于安全原因),我尝试使用 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) 传递文件信息

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()

任何人都可以帮助我/建议解决方案或更好的方法,以使用 Silverlight 将记录从 csv 导入数据库编程。

谢谢!

【问题讨论】:

    标签: wcf silverlight streamreader fileinfo


    【解决方案1】:

    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())
    

    【讨论】:

    • 谢谢卡洛斯,这确实给了我一个方向。我研究了它,它似乎工作正常。现在我改变了它的工作方式,我首先将文件上传到服务器,然后使用它来导入记录。感谢您的建议,抱歉回复晚了。
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2010-10-08
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2011-05-04
    • 2012-10-03
    相关资源
    最近更新 更多