我正在编写一个WCF WebMethod来上传文件,其中我从网络上截取了一些片段。 WCF的接口看起来是这样的:在WCF内实例化一个类
<ServiceContract()>
Public Interface ITransferService
<OperationContract()>
Sub UploadFile(ByVal request As RemoteFileInfo)
End Interface
<MessageContract()>
Public Class RemoteFileInfo
Implements IDisposable
<MessageHeader(MustUnderstand:=True)>
Public FileName As String
<MessageHeader(MustUnderstand:=True)>
Public Length As Long
<MessageBodyMember(Order:=1)>
Public FileByteStream As System.IO.Stream
Public Sub Dispose() Implements IDisposable.Dispose
If FileByteStream IsNot Nothing Then
FileByteStream.Close()
FileByteStream = Nothing
End If
End Sub
End Class
在ASP.NET中,当Web方法被消耗,由于某种原因,它只能在接口被用作RemoteFileInfo
实例化的一部分:
Protected Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click
If fu.HasFile Then
Dim fi As New System.IO.FileInfo(fu.PostedFile.FileName)
' this is the line in question --------------
Dim cu As ServiceReference1.ITransferService = New ServiceReference1.TransferServiceClient()
' -------------------------------------------
Dim uri As New ServiceReference1.RemoteFileInfo()
Using stream As New System.IO.FileStream(fu.PostedFile.FileName, IO.FileMode.Open, IO.FileAccess.Read)
uri.FileName = fu.FileName
uri.Length = fi.Length
uri.FileByteStream = stream
cu.UploadFile(uri)
End Using
End If
End Sub
任何人都可以提出建议,为什么它是不可能使用下面的方法来创建的TransferService
一个实例:
Dim cu As New ServiceReference1.TransferServiceClient()
如果我尝试ABOV E,它打破了这一行:
cu.UploadFile(uri)
...并UploadFile必须有三个参数(文件名,长度,FileByteStream)甚至存在使用这个签名没有方法被调用。
为什么在创建这个类的实例时需要接口?
哇 - 惊人的答案 - 谢谢!关于您的评论: _ >>从RemoteFileInfo类中删除MessageContract属性<< _ 我需要用DataContractAttribute替换它吗? 另外,请您详细说明可以玩什么“游戏”?作为WCF的新手,我希望得到任何额外的建议,即使这意味着更多的阅读......!再次感谢 – EvilDr
Re RemoteFileInfo:是的,最好使用DataContract,尽管它并不是严格要求的,因为WCF会自动处理普通的类对象(POCO)。重新游戏:我主要指的是可以操纵底层SOAP消息的多种方式(加密部件,使用不同的名称空间,使用不同的序列化引擎等),这些方式可能会对客户端生成的消息产生影响,也可能不会产生影响代码(请参阅MSDN文章以深入讨论各种功能)。 –
超级。非常感谢您的详细回复。 – EvilDr