To get started, implement services and contracts for sending and receiving file in stream through WCF. For the service to send or return more than 1 parameter together with Stream class, you need to implement MessageContract instead of DataContract. For more detail about MessageContract, refer to this link https://msdn.microsoft.com/en-us/library/ms730255(v=vs.110).aspx.
[C#]
[MessageContract]
public class DownloadFileResponse
{
[MessageHeader]
public string FileName { get; set; }
[MessageBodyMember]
public Stream Stream { get; set; }
}
[MessageContract]
public class SaveFileRequest
{
[MessageHeader]
public string FileName { get; set; }
[MessageBodyMember]
public Stream Stream { get; set; }
}
[ServiceBehavior(InstanceContextMode
= InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class FileService : IFileService
{
public void SaveFile(SaveFileRequest saveFileRequest)
{
// Do your stuff
}
public DownloadFileResponse DownloadFile()
{
// Do your stuff
}
}
[ServiceContract]
public interface IFileService
{
[OperationContract]
void SaveFile(SaveFileRequest saveFileRequest);
[OperationContract]
DownloadFileResponse DownloadFile();
}
[VB]
<MessageContract>
Public Class DownloadFileResponse
<MessageHeader>
Private _fileName As String
Public Property FileName() As String
Get
Return _fileName
End Get
Set(ByVal value As String)
_fileName = value
End Set
End Property
<MessageBodyMember>
Private _stream As Stream
Public Property Stream() As Stream
Get
Return _stream
End Get
Set(ByVal value As Stream)
_stream = value
End Set
End Property
End Class
<MessageContract>
Public Class SaveFileRequest
<MessageHeader>
Private _fileName As String
Public Property FileName() As String
Get
Return _fileName
End Get
Set(ByVal value As String)
_fileName = value
End Set
End Property
<MessageBodyMember>
Private _stream As Stream
Public Property Stream() As Stream
Get
Return _stream
End Get
Set(ByVal value As Stream)
_stream = value
End Set
End Property
End Class
<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerCall,
ConcurrencyMode:=ConcurrencyMode.Single)>
Public Class FileService
Implements IFileService
Public Sub SaveFile(ByVal saveFileRequest As SaveFileRequest) Implements IFileService.SaveFile
' Do your stuff
End Sub
Public Function DownloadFile() As DownloadFileResponse Implements IFileService.DownloadFile
' Do your stuff
End Function
End Class
<ServiceContract>
Public Interface IFileService
<OperationContract>
Sub SaveFile(ByVal saveFileRequest As SaveFileRequest)
<OperationContract>
Function DownloadFile() As DownloadFileResponse
End Interface
Do take note that when retrieving the stream from a physical file through File class, make sure to close and dispose the File class after moved the content into a stream to prevent the file being locked by your application.
There are few things you can configure in web configuration file. To send or receive file in stream, change the attribute "transferMode" to "Streamed" in binding element. By default, "transferMode" is "buffered", what this mean is WCF will hold the content in memory until the file is transferred, in which will lead to very high memory usage if transferring a large file. For more details about "transferMode" attribute, you may refer here https://msdn.microsoft.com/en-us/library/system.servicemodel.transfermode(v=vs.110).aspx.
The second attribute that you can configured is "maxReceivedMessageSize". This attribute is for your application to receive large file send from another application through WCF. Refer here https://msdn.microsoft.com/en-us/library/ms731361(v=vs.110).aspx if you want to know what else can you configured in binding element.
The second attribute that you can configured is "maxReceivedMessageSize". This attribute is for your application to receive large file send from another application through WCF. Refer here https://msdn.microsoft.com/en-us/library/ms731361(v=vs.110).aspx if you want to know what else can you configured in binding element.
[web.config]
<bindings>
<basicHttpBinding>
<binding name="basicHttp"
transferMode="Streamed"
maxReceivedMessageSize="2147483647"></binding>
</basicHttpBinding>
</bindings>
Make sure to assign the binding that you have configured to your service, otherwise it will not take effect. To assign the binding, set your binding name to the attribute "bindingConfiguration" under endpoint element.
[web.config]
<services>
<service name="WCFSDemoVB.Services.FileService"
behaviorConfiguration="DefaultServiceBehavior">
<endpoint name="basicHttpFileService"
address=""
binding="basicHttpBinding"
bindingConfiguration="basicHttp"
contract="WCFSDemoVB.Services.Contracts.IFileService" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
Once done, you can now create a client application to send or receive file with stream through the WCF service that you have implemented.
No comments:
Post a Comment