Solved

C# - Downloading file adding extra data (unintentionally)

Posted on 2012-03-26
13
444 Views
Last Modified: 2012-04-01
The problem I have is that I am downloading data via WCF but it is adding to the text file.

THE DATA SHOULD LOOKE LIKE BELOW

Record Count 14866
"Field"      "Type"      "Length"
"oldparent"      "Text"      "8"
"NEWPARENT"      "Text"      "8"
"PID"      "Text"      "8"
"STATUS_BLD"      "Text"      "1"
"DATE"      "Text"      "8"
"CREASON"      "Text"      "1"
"MPID"      "Text"      "8"
"NAME"      "Text"      "30"
"STREET"      "Text"      "24"
"CITY"      "Text"      "16"
"STATE"      "Text"      "2"
"ZIPCODE"      "Text"      "7"

BUT I AM GETTING

Record Count 14866
"Field"      "Type"      "Length"
"oldparent"      "Text"      "8"
"NEWPARENT"      "Text"      "8"
"PID"      "Text"      "8"
"STATUS_BLD"      "Text"      "1"
"DATE"      "Text"      "8"
"CREASON"      "Text"      "1"
"MPID"      "Text"      "8"
"NAME"      "Text"      "30"
"STREET"      "Text"      "24"
"CITY"      "Text"      "16"
"STATE"      "Text"      "2"
"ZIPCODE"      "Text"      "7"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head><title>
      Download
</title><link rel="icon" href="images/favicon.ico" type="image/ico" /><link href="Styles/Site.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        .style7
        {
            width: 42%;
        }
    </style>

ETC.....

Below is the code I am using.  

Response.BufferOutput = false;
byte[] buffer = new byte[65000];
int bytesRead = 0;

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition",
                        "attachment; filename=" + requestData.FileName);

bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length);

while (bytesRead > 0)
{
    // Verify that the client is connected.
    if (Response.IsClientConnected)
    {
        Response.OutputStream.Write(buffer, 0, bytesRead);
        // Flush the data to the HTML output.
        Response.Flush();

         buffer = new byte[65000];
         bytesRead = fileInfo.FileByteStream.Read(buffer, 0, buffer.Length);
     }
     else
     {
           bytesRead = -1;
      }
}
Response.Flush();

How do I fix?
0
Comment
Question by:CipherIS
  • 8
  • 4
13 Comments
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37771394
I don't quite understand what you are intending to return in the web service call...
0
 
LVL 1

Author Comment

by:CipherIS
ID: 37771423
I am returning a text file.  This is the data in the text file.

Record Count 14866
"Field"      "Type"      "Length"
"oldparent"      "Text"      "8"
"NEWPARENT"      "Text"      "8"
"PID"      "Text"      "8"
"STATUS_BLD"      "Text"      "1"
"DATE"      "Text"      "8"
"CREASON"      "Text"      "1"
"MPID"      "Text"      "8"
"NAME"      "Text"      "30"
"STREET"      "Text"      "24"
"CITY"      "Text"      "16"
"STATE"      "Text"      "2"
"ZIPCODE"      "Text"      "7"

This is what is being returned in the text file

Record Count 14866
"Field"      "Type"      "Length"
"oldparent"      "Text"      "8"
"NEWPARENT"      "Text"      "8"
"PID"      "Text"      "8"
"STATUS_BLD"      "Text"      "1"
"DATE"      "Text"      "8"
"CREASON"      "Text"      "1"
"MPID"      "Text"      "8"
"NAME"      "Text"      "30"
"STREET"      "Text"      "24"
"CITY"      "Text"      "16"
"STATE"      "Text"      "2"
"ZIPCODE"      "Text"      "7"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head><title>
      Download
</title><link rel="icon" href="images/favicon.ico" type="image/ico" /><link href="Styles/Site.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        .style7
        {
            width: 42%;
        }
    </style>

ETC.....

Some how this is being appended to the text file and it shouldn't be.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head><title>
      Download
</title><link rel="icon" href="images/favicon.ico" type="image/ico" /><link href="Styles/Site.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        .style7
        {
            width: 42%;
        }
    </style>

ETC.....
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37771453
What type of WCF service is this?

Instead of application/octet-stream, did you try text/plain?
0
 
LVL 1

Author Comment

by:CipherIS
ID: 37771624
I replaced with text/plain and still getting below added to it.  Didn't work.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head><title>
      Download
</title><link rel="icon" href="images/favicon.ico" type="image/ico" /><link href="Styles/Site.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        .style7
        {
            width: 42%;
        }
    </style>

ETC.....
0
 
LVL 1

Author Comment

by:CipherIS
ID: 37771669
Another thing I need to mention is that the download downloads other file types such as:

PDF and XLS
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37771735
What type of WCF web service are you working with?
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 1

Author Comment

by:CipherIS
ID: 37771892
basicHTTPBinding.  

The webservice works fine.  It returns all the files.  The only issue is when the text file is being downloaded it adds the HTML code to the text file.

Here is the code in the WCF Service that returns the file

public RemoteFileInfo APIDownloadFile(DownloadRequest request)
{
      string UNCPath = string.Empty;

      RemoteFileInfo result = new RemoteFileInfo();

      try
      {

            string WriteError = Path.Combine(@"C:\Logs\APIFulfillment", "APIDownloadFile.txt");
            using (StreamWriter outfile2 = new StreamWriter(WriteError))
            {
                  //Get Path and FileName
                  UNCPath = APIGetUNCPath(request.AccessKey, request.FileName);
                  outfile2.WriteLine(UNCPath + " | " + DateTime.Now, Environment.NewLine);

                  FileInfo fileInfo = new FileInfo(UNCPath);
                  outfile2.WriteLine("fileInfo" + " | " + DateTime.Now);

                  //Check if exists
                  if (!fileInfo.Exists)
                  {
                        throw new System.IO.FileNotFoundException("File not found", request.FileName);
                  }
                  request.FileSize = fileInfo.Length;
                  outfile2.WriteLine("File Exists" + " | " + DateTime.Now, Environment.NewLine);

                  //Open stream
                  FileStream stream = new FileStream(UNCPath, FileMode.Open, FileAccess.Read);
                  outfile2.WriteLine("FileStream" + " | " + DateTime.Now, Environment.NewLine);

                  //Return result
                  result.FileName = request.FileName;
                  result.Length = fileInfo.Length;
                  result.FileByteStream = stream;
                  outfile2.WriteLine("Result" + " | " + DateTime.Now, Environment.NewLine);

                  //Close the stream to prevent file access denied issue
                  OperationContext.Current.OperationCompleted += (sender, args) =>
                  {
                        if (result.FileByteStream != null)
                        {
                              result.FileByteStream.Dispose();
                        }
                  };
                  outfile2.WriteLine("Close" + " | " + DateTime.Now, Environment.NewLine);
                  outfile2.Close();
            }
      }
      catch (Exception ex)
      {
            //Need to write Error someplace
            string s = ex.Message;

            string WriteError2 = Path.Combine(@"C:\Logs\APIFulfillment", "APIDownloadFile_Error.txt");
            using (StreamWriter outfile = new StreamWriter(WriteError2))
            {
                  outfile.WriteLine(s + " | " + DateTime.Now, Environment.NewLine);
                  outfile.Close();
            }
      }

      return result;
}
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 37772037
Have you thought about Streaming?

How to: Enable Streaming
http://msdn.microsoft.com/en-us/library/ms789010.aspx
0
 
LVL 22

Expert Comment

by:ambience
ID: 37772264
The problem does not look like with the service return but the way you are returning the file to the client. It looks like the Master Page/Layout gets rendered after you output the file.

I'm not sure about the best way to inhibit page rendering from a particular callback. Try calling Response.End right after you flush

Response.Flush();
Response.End();
0
 
LVL 1

Author Comment

by:CipherIS
ID: 37772857
@ambience - Response.End() causes an error.
0
 
LVL 1

Author Comment

by:CipherIS
ID: 37774412
Does anyone have an answer?
0
 
LVL 1

Accepted Solution

by:
CipherIS earned 0 total points
ID: 37774621
I figured it out.  Below is the solution.

                    //Determine how to write the file
                    switch (ext.ToLower())
                    {
                        case ".txt":
                            Response.BinaryWrite(buffer);
                            break;
                        default:
                            Response.OutputStream.Write(buffer, 0, bytesRead);
                            break;
                    }
0
 
LVL 1

Author Closing Comment

by:CipherIS
ID: 37792777
I figured it out.
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

26 Experts available now in Live!

Get 1:1 Help Now