WCF - Upload a file to a service with a progress bar in the client<p align=left><font style="background-color:#f0effa" face="Times New Roman">Hi all,</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman">I'm currently experimenting WCF, i'm pretty new to this whole thing actually. I'm using VB.NET (VS2005). So here's the thing: I'm building a small test application using WCF to upload a file to a service. I created 2 ways of uploading my file, both work perfectly. I can send the file in chunks or stream it. I tried to add a progress bar so I could see the progress on the client side. Works perfect with the chunk upload, but I can't seem to get it to work with streaming. I tried using a callback, but it seems that I won't receive any callback before the whole process is done. I do know that's normal since I didnt use &quot;IsOneWay:=True&quot;but I do not want to use this attribute because I don't want the process to continue before the file is totally uploaded.</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman">Is there any way to send some feedback from my service to my client to monitor progress?</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman">Here are parts of my code:</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"><strong>Service</strong></font></p> <p> </p> <p>&lt;ServiceContract(CallbackContract:=<font color="#0000ff">GetType</font>(IServiceUploadFichierCallBack), SessionMode:=SessionMode.Required)&gt; _</p> <p><font color="#0000ff">Public</font> <font color="#0000ff">Interface</font> IServiceUploadFichier</p> <blockquote dir=ltr style="margin-right:0px"> <p>&lt;OperationContract()&gt; <font color="#0000ff">Sub</font> UploaderFichierStream(<font color="#0000ff">ByVal</font> pfStream <font color="#0000ff">As</font> Stream)</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Interface</p></font> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">Public</font> <font color="#0000ff">Interface</font> IServiceUploadFichierCallBack</p> <blockquote dir=ltr style="margin-right:0px"> <p>&lt;OperationContract(IsOneWay:=<font color="#0000ff">True</font>)&gt; <font color="#0000ff">Sub</font> MAJFloodStream(<font color="#0000ff">ByVal</font> pintStream <font color="#0000ff">As</font> <font color="#0000ff">Integer</font>)</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Interface</p> <p> </p> <p align=left> </p> <p align=left><strong><font face="Times New Roman" color="#000000">Upload function</font></strong></font></p> <p> </p> <p><font color="#0000ff">Public</font> <font color="#0000ff">Sub</font> UploaderFichierStream(<font color="#0000ff">ByVal</font> pfStream <font color="#0000ff">As</font> System.IO.Stream) <font color="#0000ff">Implements</font> IServiceUploadFichier.UploaderFichierStream</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Dim</font> outstream <font color="#0000ff">As</font> FileStream = File.Open(mstrDestination, FileMode.Create, FileAccess.Write)</p> <p><font color="#0000ff">Dim</font> content() <font color="#0000ff">As</font> <font color="#0000ff">Byte</p></font> <p><font color="#0000ff">ReDim</font> content(0)</p> <p><font color="#0000ff">Const</font> bufferLen <font color="#0000ff">As</font> <font color="#0000ff">Integer</font> = 4096</p> <p><font color="#0000ff">Dim</font> buffer(bufferLen) <font color="#0000ff">As</font> <font color="#0000ff">Byte</p></font> <p><font color="#0000ff">Dim</font> count <font color="#0000ff">As</font> <font color="#0000ff">Integer</font> = 0</p></blockquote> <p> </p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>Callback = OperationContext.Current.GetCallbackChannel(<font color="#0000ff">Of</font> IServiceUploadFichierCallBack)()</p> <p>count = pfStream.Read(buffer, 0, bufferLen)</p> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">While</font> (count &gt; 0)</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Try</p></font> <p dir=ltr style="margin-right:0px">     Console.Write(<font color="#a31515">&quot;.&quot;</font>)</p> <p><font color="#008000">     </font>outstream.Write(buffer, 0, count)</p> <p>     Callback.MAJFloodStream(count)</p> <p>     count = pfStream.Read(buffer, 0, bufferLen)</p> <p align=left><font color="#0000ff">Catch</font> ex <font color="#0000ff">As</font> Exception</p> <p><font color="#0000ff">     Call</font> MsgBox(ex.Message)</p> <p><font color="#0000ff">End</font> <font color="#0000ff">Try</p></blockquote></font> <p><font color="#0000ff">End</font> <font color="#0000ff">While</p></font> <p>outstream.Close()</p> <p>pfStream.Close()</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Sub</p> <p> </p> <p align=left> </p> <p align=left></font> </p> <p><strong>This is what I use on the client side:</strong></p> <p align=left> </p><font color="#0000ff"> <p>Public</font> <font color="#0000ff">Class</font> CallbackHandler</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Implements</font> ServiceUploadFichier.IServiceUploadFichierCallback</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Public</font> <font color="#0000ff">Sub</font> MAJFloodStream(<font color="#0000ff">ByVal</font> pintStream <font color="#0000ff">As</font> <font color="#0000ff">Integer</font>) <font color="#0000ff">Implements</font> ServiceUploadFichier.IServiceUploadFichierCallback.MAJFloodStream</p> <p>Form1.ProgressBar2.Value = Form1.ProgressBar2.Value + pintStream</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Sub</p></blockquote> <p>End</font> <font color="#0000ff">Class</font></p> <p align=left><font color="#0000ff"></font> </p> <p><font color="#0000ff">Private</font> <font color="#0000ff">Sub</font> cmdShareStream_Click_1(<font color="#0000ff">ByVal</font> sender <font color="#0000ff">As</font> System.Object, <font color="#0000ff">ByVal</font> e <font color="#0000ff">As</font> System.EventArgs) <font color="#0000ff">Handles</font> cmdShareStream.Click</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">Dim</font> Callback <font color="#0000ff">As</font> InstanceContext = <font color="#0000ff">New</font> InstanceContext(<font color="#0000ff">New</font> CallbackHandler)</p> <p><font color="#0000ff">Dim</font> service <font color="#0000ff">As</font> <font color="#0000ff">New</font> ServiceUploadFichier.ServiceUploadFichierClient(Callback)</p> <p><font color="#0000ff">Dim</font> infoFichier <font color="#0000ff">As</font> <font color="#0000ff">New</font> ServiceUploadFichier.MessageInfoFichier</p> <p><font color="#0000ff">Dim</font> fstream <font color="#0000ff">As</font> FileStream = <font color="#0000ff">New</font> FileStream(txtSource.Text, FileMode.Open)</p> <p><font color="#0000ff">Dim</font> dblAvant <font color="#0000ff">As</font> <font color="#0000ff">Double</p></font> <p><font color="#0000ff">Dim</font> dblApres <font color="#0000ff">As</font> <font color="#0000ff">Double</p></blockquote></font> <p> </p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>service.Open()</p> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">Try</p></font> <blockquote dir=ltr style="margin-right:0px"> <p>dblAvant = Timer</p> <p>infoFichier.Destination = txtDestination.Text</p> <p>service.InitialiserFichier(<font color="#a31515">&quot;&quot;</font>, <font color="#a31515">&quot;&quot;</font>, infoFichier.Destination)</p> <p>ProgressBar2.Value = 0</p> <p>ProgressBar2.Maximum = fstream.Length</p> <p>service.UploaderFichierStream(fstream)</p> <p>dblApres = Timer</p> <p>lblTempsStream.Text = (dblApres - dblAvant).ToString(<font color="#a31515">&quot;0.00&quot;</font>)</p> <p><font color="#0000ff">Call</font> MsgBox(<font color="#a31515">&quot;Source: &quot;</font> &amp; txtDestination.Text &amp; vbCrLf &amp; <font color="#a31515">&quot;Destination: &quot;</font> &amp; txtAdresseSharepoint.Text)</p></blockquote> <p dir=ltr><font color="#0000ff">Catch</font> ex <font color="#0000ff">As</font> Exception</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Call</font> MsgBox(ex.Message)</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Try</p></font> <p> </p> <p align=left>fstream.Close()</p> <p>service.Close()</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Sub</p> <p> </p> <p align=left> </p> <p align=left></font><font face="Times New Roman" color="#000000">I think I posted the most important parts, don't hesitate to ask I more is needed to find the problem <img alt=Smile src="http://forums.microsoft.com/MSDN/emoticons/emotion-1.gif"></font></p> <p> </p> <p align=left>Thanks in advance,</p> <p align=left> </p> <p align=left>Fred</p>© 2009 Microsoft Corporation. All rights reserved.Fri, 26 Jun 2009 13:36:58 Z6835e377-949f-490b-9bf3-30ea49f4bf41http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6835e377-949f-490b-9bf3-30ea49f4bf41#6835e377-949f-490b-9bf3-30ea49f4bf41http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6835e377-949f-490b-9bf3-30ea49f4bf41#6835e377-949f-490b-9bf3-30ea49f4bf41Freddy Mercuryhttp://social.msdn.microsoft.com/Profile/en-US/?user=Freddy%20MercuryWCF - Upload a file to a service with a progress bar in the client<p align=left><font style="background-color:#f0effa" face="Times New Roman">Hi all,</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman">I'm currently experimenting WCF, i'm pretty new to this whole thing actually. I'm using VB.NET (VS2005). So here's the thing: I'm building a small test application using WCF to upload a file to a service. I created 2 ways of uploading my file, both work perfectly. I can send the file in chunks or stream it. I tried to add a progress bar so I could see the progress on the client side. Works perfect with the chunk upload, but I can't seem to get it to work with streaming. I tried using a callback, but it seems that I won't receive any callback before the whole process is done. I do know that's normal since I didnt use &quot;IsOneWay:=True&quot;but I do not want to use this attribute because I don't want the process to continue before the file is totally uploaded.</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman">Is there any way to send some feedback from my service to my client to monitor progress?</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman">Here are parts of my code:</font></p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"></font> </p> <p align=left><font style="background-color:#f0effa" face="Times New Roman"><strong>Service</strong></font></p> <p> </p> <p>&lt;ServiceContract(CallbackContract:=<font color="#0000ff">GetType</font>(IServiceUploadFichierCallBack), SessionMode:=SessionMode.Required)&gt; _</p> <p><font color="#0000ff">Public</font> <font color="#0000ff">Interface</font> IServiceUploadFichier</p> <blockquote dir=ltr style="margin-right:0px"> <p>&lt;OperationContract()&gt; <font color="#0000ff">Sub</font> UploaderFichierStream(<font color="#0000ff">ByVal</font> pfStream <font color="#0000ff">As</font> Stream)</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Interface</p></font> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">Public</font> <font color="#0000ff">Interface</font> IServiceUploadFichierCallBack</p> <blockquote dir=ltr style="margin-right:0px"> <p>&lt;OperationContract(IsOneWay:=<font color="#0000ff">True</font>)&gt; <font color="#0000ff">Sub</font> MAJFloodStream(<font color="#0000ff">ByVal</font> pintStream <font color="#0000ff">As</font> <font color="#0000ff">Integer</font>)</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Interface</p> <p> </p> <p align=left> </p> <p align=left><strong><font face="Times New Roman" color="#000000">Upload function</font></strong></font></p> <p> </p> <p><font color="#0000ff">Public</font> <font color="#0000ff">Sub</font> UploaderFichierStream(<font color="#0000ff">ByVal</font> pfStream <font color="#0000ff">As</font> System.IO.Stream) <font color="#0000ff">Implements</font> IServiceUploadFichier.UploaderFichierStream</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Dim</font> outstream <font color="#0000ff">As</font> FileStream = File.Open(mstrDestination, FileMode.Create, FileAccess.Write)</p> <p><font color="#0000ff">Dim</font> content() <font color="#0000ff">As</font> <font color="#0000ff">Byte</p></font> <p><font color="#0000ff">ReDim</font> content(0)</p> <p><font color="#0000ff">Const</font> bufferLen <font color="#0000ff">As</font> <font color="#0000ff">Integer</font> = 4096</p> <p><font color="#0000ff">Dim</font> buffer(bufferLen) <font color="#0000ff">As</font> <font color="#0000ff">Byte</p></font> <p><font color="#0000ff">Dim</font> count <font color="#0000ff">As</font> <font color="#0000ff">Integer</font> = 0</p></blockquote> <p> </p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>Callback = OperationContext.Current.GetCallbackChannel(<font color="#0000ff">Of</font> IServiceUploadFichierCallBack)()</p> <p>count = pfStream.Read(buffer, 0, bufferLen)</p> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">While</font> (count &gt; 0)</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Try</p></font> <p dir=ltr style="margin-right:0px">     Console.Write(<font color="#a31515">&quot;.&quot;</font>)</p> <p><font color="#008000">     </font>outstream.Write(buffer, 0, count)</p> <p>     Callback.MAJFloodStream(count)</p> <p>     count = pfStream.Read(buffer, 0, bufferLen)</p> <p align=left><font color="#0000ff">Catch</font> ex <font color="#0000ff">As</font> Exception</p> <p><font color="#0000ff">     Call</font> MsgBox(ex.Message)</p> <p><font color="#0000ff">End</font> <font color="#0000ff">Try</p></blockquote></font> <p><font color="#0000ff">End</font> <font color="#0000ff">While</p></font> <p>outstream.Close()</p> <p>pfStream.Close()</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Sub</p> <p> </p> <p align=left> </p> <p align=left></font> </p> <p><strong>This is what I use on the client side:</strong></p> <p align=left> </p><font color="#0000ff"> <p>Public</font> <font color="#0000ff">Class</font> CallbackHandler</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Implements</font> ServiceUploadFichier.IServiceUploadFichierCallback</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Public</font> <font color="#0000ff">Sub</font> MAJFloodStream(<font color="#0000ff">ByVal</font> pintStream <font color="#0000ff">As</font> <font color="#0000ff">Integer</font>) <font color="#0000ff">Implements</font> ServiceUploadFichier.IServiceUploadFichierCallback.MAJFloodStream</p> <p>Form1.ProgressBar2.Value = Form1.ProgressBar2.Value + pintStream</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Sub</p></blockquote> <p>End</font> <font color="#0000ff">Class</font></p> <p align=left><font color="#0000ff"></font> </p> <p><font color="#0000ff">Private</font> <font color="#0000ff">Sub</font> cmdShareStream_Click_1(<font color="#0000ff">ByVal</font> sender <font color="#0000ff">As</font> System.Object, <font color="#0000ff">ByVal</font> e <font color="#0000ff">As</font> System.EventArgs) <font color="#0000ff">Handles</font> cmdShareStream.Click</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">Dim</font> Callback <font color="#0000ff">As</font> InstanceContext = <font color="#0000ff">New</font> InstanceContext(<font color="#0000ff">New</font> CallbackHandler)</p> <p><font color="#0000ff">Dim</font> service <font color="#0000ff">As</font> <font color="#0000ff">New</font> ServiceUploadFichier.ServiceUploadFichierClient(Callback)</p> <p><font color="#0000ff">Dim</font> infoFichier <font color="#0000ff">As</font> <font color="#0000ff">New</font> ServiceUploadFichier.MessageInfoFichier</p> <p><font color="#0000ff">Dim</font> fstream <font color="#0000ff">As</font> FileStream = <font color="#0000ff">New</font> FileStream(txtSource.Text, FileMode.Open)</p> <p><font color="#0000ff">Dim</font> dblAvant <font color="#0000ff">As</font> <font color="#0000ff">Double</p></font> <p><font color="#0000ff">Dim</font> dblApres <font color="#0000ff">As</font> <font color="#0000ff">Double</p></blockquote></font> <p> </p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>service.Open()</p> <p><font color="#0000ff"></font> </p> <p align=left><font color="#0000ff">Try</p></font> <blockquote dir=ltr style="margin-right:0px"> <p>dblAvant = Timer</p> <p>infoFichier.Destination = txtDestination.Text</p> <p>service.InitialiserFichier(<font color="#a31515">&quot;&quot;</font>, <font color="#a31515">&quot;&quot;</font>, infoFichier.Destination)</p> <p>ProgressBar2.Value = 0</p> <p>ProgressBar2.Maximum = fstream.Length</p> <p>service.UploaderFichierStream(fstream)</p> <p>dblApres = Timer</p> <p>lblTempsStream.Text = (dblApres - dblAvant).ToString(<font color="#a31515">&quot;0.00&quot;</font>)</p> <p><font color="#0000ff">Call</font> MsgBox(<font color="#a31515">&quot;Source: &quot;</font> &amp; txtDestination.Text &amp; vbCrLf &amp; <font color="#a31515">&quot;Destination: &quot;</font> &amp; txtAdresseSharepoint.Text)</p></blockquote> <p dir=ltr><font color="#0000ff">Catch</font> ex <font color="#0000ff">As</font> Exception</p> <blockquote dir=ltr style="margin-right:0px"> <p><font color="#0000ff">Call</font> MsgBox(ex.Message)</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Try</p></font> <p> </p> <p align=left>fstream.Close()</p> <p>service.Close()</p></blockquote> <p><font color="#0000ff">End</font> <font color="#0000ff">Sub</p> <p> </p> <p align=left> </p> <p align=left></font><font face="Times New Roman" color="#000000">I think I posted the most important parts, don't hesitate to ask I more is needed to find the problem <img alt=Smile src="http://forums.microsoft.com/MSDN/emoticons/emotion-1.gif"></font></p> <p> </p> <p align=left>Thanks in advance,</p> <p align=left> </p> <p align=left>Fred</p>Tue, 07 Aug 2007 19:28:57 Z2007-08-08T01:50:08Zhttp://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6835e377-949f-490b-9bf3-30ea49f4bf41#61d150a5-66a1-4531-9121-e51803acc0b3http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6835e377-949f-490b-9bf3-30ea49f4bf41#61d150a5-66a1-4531-9121-e51803acc0b3James.Zhang - MSFThttp://social.msdn.microsoft.com/Profile/en-US/?user=James.Zhang%20-%20MSFTWCF - Upload a file to a service with a progress bar in the client<p align=left><font face=Arial size=2>Please ref to the following post:</font></p> <p align=left> </p> <p align=left><a title="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1837514&amp;SiteID=1" href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1837514&amp;SiteID=1">http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1837514&amp;SiteID=1</a></p> <p align=left> </p>Wed, 08 Aug 2007 01:49:57 Z2007-08-08T01:50:08Zhttp://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6835e377-949f-490b-9bf3-30ea49f4bf41#e06a6157-d019-4d10-a2ab-13d6d7f75a3fhttp://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6835e377-949f-490b-9bf3-30ea49f4bf41#e06a6157-d019-4d10-a2ab-13d6d7f75a3fSean McIlvennahttp://social.msdn.microsoft.com/Profile/en-US/?user=Sean%20McIlvennaWCF - Upload a file to a service with a progress bar in the client<p>Here is another post: <a href="http://seanmcilvenna.com/blog/11-solutions/20-detecting-upload-progress-with-wcf">http://seanmcilvenna.com/blog/11-solutions/20-detecting-upload-progress-with-wcf</a></p>Fri, 26 Jun 2009 13:36:57 Z2009-06-26T13:36:57Z