我正在編寫一個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