By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,961 Members | 2,492 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,961 IT Pros & Developers. It's quick & easy.

Stream large file in WSE 3.0

P: n/a
Hi all,
I am new to WSE 3.0, and currently reading the document shipped with
installation. From sample provided (see below), I created WSE service side
code, but how can I consume stream returned by web method in my Web Form
application? I already configurated web.config of my web service by running
WSE 3.0 setting tool.

Thanks!
[WebMethod(BufferResponse = false)]
public GetFileResponseWrapper GetStream () {
String filePath = @"e:\temp\70ONEEL06COMP.pdf";
return new GetFileResponseWrapper(filePath);
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.CodeDom.Compiler;

/// <summary>
/// Summary description for GetFileResponseWrapper
/// </summary>
[XmlSchemaProvider("GetMySchema")]
public class GetFileResponseWrapper : IXmlSerializable, IDisposable {
private string _fileName;
private TempFileCollection tfc = null;

public string FileName { get { return _fileName; } }

public GetFileResponseWrapper ()
: this(null) {
}

public GetFileResponseWrapper (string fileName) {
_fileName = fileName;
// Manages the temp file that contains the file contents
// Dispose this wrapper to clean up temp files.
TempFileCollection tfc = new TempFileCollection();
}

#region Dispose logic
~GetFileResponseWrapper () {
Dispose(false);
}

public void Dispose () {
Dispose(true);
}

void Dispose (bool isDisposing) {
if (isDisposing && tfc != null)
tfc.Delete();
tfc = null;
}
#endregion

/// <summary>
/// The schema for the file contents node is actually just
/// base 64 binary data so return the qname of the schema
/// type directly.
/// </summary>
public static XmlQualifiedName GetMySchema (XmlSchemaSet xss) {
return new XmlQualifiedName("Base64Binary",
"http://www.w3.org/2001/XMLSchema");
}

/// <summary>
/// Always return null.
/// </summary>
public XmlSchema GetSchema () { return null; }

/// <summary>
/// Deserializes state out of an XmlReader
/// </summary>
public void ReadXml (XmlReader r) {
// Read the open tag of the encapsulating element
r.ReadStartElement();

//
// Read the binary data that represents the file contents
// into a temp file.
//
_fileName = tfc.AddExtension("fileContents", false);
ReadContentsIntoFile(r, _fileName);

// Read the close tag of the encapsulating element
r.ReadEndElement();
}

/// <summary>
/// Serializes state into an XmlWriter
/// </summary>
public void WriteXml (XmlWriter w) {
using (FileStream fs = new FileStream(_fileName, FileMode.Open)) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = fs.Read(buf, 0, 1024)) 0) {
w.WriteBase64(buf, 0, numRead);
}
}
}

void ReadContentsIntoFile (XmlReader r, string fileName) {
using (FileStream fs = new FileStream(fileName, FileMode.CreateNew))
{
if (r.CanReadBinaryContent) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = r.ReadContentAsBase64(buf, 0, 1024)) 0)
{
fs.Write(buf, 0, numRead);
}
} else {
throw new NotSupportedException();
}
}
}
}
Oct 3 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Hi,

To my knowledge if you are to utilize the WSE MTOM then you got to send your
file as a byte[] not as a custom object at your will.. only the byte[] will
recognize by the Optimization machanism..

The GetFileResponseWrapper will pass olny the single public property it
has.. that is... FileName but in your case that also will not since it does
not have the setter part, since the object serialization/ deserialization is
needed the set/ get both to send it via SOAP successfully... I think you are
doing this very veyr wrong..

Since you said you are reading the help I will stop it here...

Nirosh.

object
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:Oq**************@TK2MSFTNGP02.phx.gbl...
Hi all,
I am new to WSE 3.0, and currently reading the document shipped with
installation. From sample provided (see below), I created WSE service side
code, but how can I consume stream returned by web method in my Web Form
application? I already configurated web.config of my web service by
running WSE 3.0 setting tool.

Thanks!
[WebMethod(BufferResponse = false)]
public GetFileResponseWrapper GetStream () {
String filePath = @"e:\temp\70ONEEL06COMP.pdf";
return new GetFileResponseWrapper(filePath);
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.CodeDom.Compiler;

/// <summary>
/// Summary description for GetFileResponseWrapper
/// </summary>
[XmlSchemaProvider("GetMySchema")]
public class GetFileResponseWrapper : IXmlSerializable, IDisposable {
private string _fileName;
private TempFileCollection tfc = null;

public string FileName { get { return _fileName; } }

public GetFileResponseWrapper ()
: this(null) {
}

public GetFileResponseWrapper (string fileName) {
_fileName = fileName;
// Manages the temp file that contains the file contents
// Dispose this wrapper to clean up temp files.
TempFileCollection tfc = new TempFileCollection();
}

#region Dispose logic
~GetFileResponseWrapper () {
Dispose(false);
}

public void Dispose () {
Dispose(true);
}

void Dispose (bool isDisposing) {
if (isDisposing && tfc != null)
tfc.Delete();
tfc = null;
}
#endregion

/// <summary>
/// The schema for the file contents node is actually just
/// base 64 binary data so return the qname of the schema
/// type directly.
/// </summary>
public static XmlQualifiedName GetMySchema (XmlSchemaSet xss) {
return new XmlQualifiedName("Base64Binary",
"http://www.w3.org/2001/XMLSchema");
}

/// <summary>
/// Always return null.
/// </summary>
public XmlSchema GetSchema () { return null; }

/// <summary>
/// Deserializes state out of an XmlReader
/// </summary>
public void ReadXml (XmlReader r) {
// Read the open tag of the encapsulating element
r.ReadStartElement();

//
// Read the binary data that represents the file contents
// into a temp file.
//
_fileName = tfc.AddExtension("fileContents", false);
ReadContentsIntoFile(r, _fileName);

// Read the close tag of the encapsulating element
r.ReadEndElement();
}

/// <summary>
/// Serializes state into an XmlWriter
/// </summary>
public void WriteXml (XmlWriter w) {
using (FileStream fs = new FileStream(_fileName, FileMode.Open)) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = fs.Read(buf, 0, 1024)) 0) {
w.WriteBase64(buf, 0, numRead);
}
}
}

void ReadContentsIntoFile (XmlReader r, string fileName) {
using (FileStream fs = new FileStream(fileName,
FileMode.CreateNew)) {
if (r.CanReadBinaryContent) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = r.ReadContentAsBase64(buf, 0, 1024)) 0)
{
fs.Write(buf, 0, numRead);
}
} else {
throw new NotSupportedException();
}
}
}
}

Oct 3 '06 #2

P: n/a
Thanks for your comment, I read this example from
ms-help://MS.WSE30.1033/WSE3.0/html/3e9ce678-2502-4847-9f13-5173896c9db5.htm
or from MS MSDN
http://msdn.microsoft.com/library/de...73896c9db5.asp

Any idea what should I do?

"Champika Nirosh" <te**@tc.comwrote in message
news:Op**************@TK2MSFTNGP03.phx.gbl...
Hi,

To my knowledge if you are to utilize the WSE MTOM then you got to send
your file as a byte[] not as a custom object at your will.. only the
byte[] will recognize by the Optimization machanism..

The GetFileResponseWrapper will pass olny the single public property it
has.. that is... FileName but in your case that also will not since it
does not have the setter part, since the object serialization/
deserialization is needed the set/ get both to send it via SOAP
successfully... I think you are doing this very veyr wrong..

Since you said you are reading the help I will stop it here...

Nirosh.

object
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:Oq**************@TK2MSFTNGP02.phx.gbl...
>Hi all,
I am new to WSE 3.0, and currently reading the document shipped with
installation. From sample provided (see below), I created WSE service
side code, but how can I consume stream returned by web method in my Web
Form application? I already configurated web.config of my web service by
running WSE 3.0 setting tool.

Thanks!
[WebMethod(BufferResponse = false)]
public GetFileResponseWrapper GetStream () {
String filePath = @"e:\temp\70ONEEL06COMP.pdf";
return new GetFileResponseWrapper(filePath);
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.CodeDom.Compiler;

/// <summary>
/// Summary description for GetFileResponseWrapper
/// </summary>
[XmlSchemaProvider("GetMySchema")]
public class GetFileResponseWrapper : IXmlSerializable, IDisposable {
private string _fileName;
private TempFileCollection tfc = null;

public string FileName { get { return _fileName; } }

public GetFileResponseWrapper ()
: this(null) {
}

public GetFileResponseWrapper (string fileName) {
_fileName = fileName;
// Manages the temp file that contains the file contents
// Dispose this wrapper to clean up temp files.
TempFileCollection tfc = new TempFileCollection();
}

#region Dispose logic
~GetFileResponseWrapper () {
Dispose(false);
}

public void Dispose () {
Dispose(true);
}

void Dispose (bool isDisposing) {
if (isDisposing && tfc != null)
tfc.Delete();
tfc = null;
}
#endregion

/// <summary>
/// The schema for the file contents node is actually just
/// base 64 binary data so return the qname of the schema
/// type directly.
/// </summary>
public static XmlQualifiedName GetMySchema (XmlSchemaSet xss) {
return new XmlQualifiedName("Base64Binary",
"http://www.w3.org/2001/XMLSchema");
}

/// <summary>
/// Always return null.
/// </summary>
public XmlSchema GetSchema () { return null; }

/// <summary>
/// Deserializes state out of an XmlReader
/// </summary>
public void ReadXml (XmlReader r) {
// Read the open tag of the encapsulating element
r.ReadStartElement();

//
// Read the binary data that represents the file contents
// into a temp file.
//
_fileName = tfc.AddExtension("fileContents", false);
ReadContentsIntoFile(r, _fileName);

// Read the close tag of the encapsulating element
r.ReadEndElement();
}

/// <summary>
/// Serializes state into an XmlWriter
/// </summary>
public void WriteXml (XmlWriter w) {
using (FileStream fs = new FileStream(_fileName, FileMode.Open)) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = fs.Read(buf, 0, 1024)) 0) {
w.WriteBase64(buf, 0, numRead);
}
}
}

void ReadContentsIntoFile (XmlReader r, string fileName) {
using (FileStream fs = new FileStream(fileName,
FileMode.CreateNew)) {
if (r.CanReadBinaryContent) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = r.ReadContentAsBase64(buf, 0, 1024)) >
0) {
fs.Write(buf, 0, numRead);
}
} else {
throw new NotSupportedException();
}
}
}
}


Oct 3 '06 #3

P: n/a
I didn't read the link you gave but have a look here

http://msdn.microsoft.com/library/de...3f89f786bd.asp

and receiving part is even more simpler.. assuming that you know how to
create the proxy etc
byte[] response = serviceproxy.GetFile(fileName);
will let you access the binary stream received..

Nirosh.
Note: Please also refer to the sample given with the WSE 3.0.. check the
startup menu items.. under Microsoft WSE 3.0 >Document
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
Thanks for your comment, I read this example from
ms-help://MS.WSE30.1033/WSE3.0/html/3e9ce678-2502-4847-9f13-5173896c9db5.htm
or from MS MSDN
http://msdn.microsoft.com/library/de...73896c9db5.asp

Any idea what should I do?

"Champika Nirosh" <te**@tc.comwrote in message
news:Op**************@TK2MSFTNGP03.phx.gbl...
>Hi,

To my knowledge if you are to utilize the WSE MTOM then you got to send
your file as a byte[] not as a custom object at your will.. only the
byte[] will recognize by the Optimization machanism..

The GetFileResponseWrapper will pass olny the single public property it
has.. that is... FileName but in your case that also will not since it
does not have the setter part, since the object serialization/
deserialization is needed the set/ get both to send it via SOAP
successfully... I think you are doing this very veyr wrong..

Since you said you are reading the help I will stop it here...

Nirosh.

object
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:Oq**************@TK2MSFTNGP02.phx.gbl...
>>Hi all,
I am new to WSE 3.0, and currently reading the document shipped with
installation. From sample provided (see below), I created WSE service
side code, but how can I consume stream returned by web method in my Web
Form application? I already configurated web.config of my web service by
running WSE 3.0 setting tool.

Thanks!
[WebMethod(BufferResponse = false)]
public GetFileResponseWrapper GetStream () {
String filePath = @"e:\temp\70ONEEL06COMP.pdf";
return new GetFileResponseWrapper(filePath);
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.CodeDom.Compiler;

/// <summary>
/// Summary description for GetFileResponseWrapper
/// </summary>
[XmlSchemaProvider("GetMySchema")]
public class GetFileResponseWrapper : IXmlSerializable, IDisposable {
private string _fileName;
private TempFileCollection tfc = null;

public string FileName { get { return _fileName; } }

public GetFileResponseWrapper ()
: this(null) {
}

public GetFileResponseWrapper (string fileName) {
_fileName = fileName;
// Manages the temp file that contains the file contents
// Dispose this wrapper to clean up temp files.
TempFileCollection tfc = new TempFileCollection();
}

#region Dispose logic
~GetFileResponseWrapper () {
Dispose(false);
}

public void Dispose () {
Dispose(true);
}

void Dispose (bool isDisposing) {
if (isDisposing && tfc != null)
tfc.Delete();
tfc = null;
}
#endregion

/// <summary>
/// The schema for the file contents node is actually just
/// base 64 binary data so return the qname of the schema
/// type directly.
/// </summary>
public static XmlQualifiedName GetMySchema (XmlSchemaSet xss) {
return new XmlQualifiedName("Base64Binary",
"http://www.w3.org/2001/XMLSchema");
}

/// <summary>
/// Always return null.
/// </summary>
public XmlSchema GetSchema () { return null; }

/// <summary>
/// Deserializes state out of an XmlReader
/// </summary>
public void ReadXml (XmlReader r) {
// Read the open tag of the encapsulating element
r.ReadStartElement();

//
// Read the binary data that represents the file contents
// into a temp file.
//
_fileName = tfc.AddExtension("fileContents", false);
ReadContentsIntoFile(r, _fileName);

// Read the close tag of the encapsulating element
r.ReadEndElement();
}

/// <summary>
/// Serializes state into an XmlWriter
/// </summary>
public void WriteXml (XmlWriter w) {
using (FileStream fs = new FileStream(_fileName, FileMode.Open))
{
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = fs.Read(buf, 0, 1024)) 0) {
w.WriteBase64(buf, 0, numRead);
}
}
}

void ReadContentsIntoFile (XmlReader r, string fileName) {
using (FileStream fs = new FileStream(fileName,
FileMode.CreateNew)) {
if (r.CanReadBinaryContent) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = r.ReadContentAsBase64(buf, 0, 1024)) >
0) {
fs.Write(buf, 0, numRead);
}
} else {
throw new NotSupportedException();
}
}
}
}



Oct 3 '06 #4

P: n/a
Thanks, I already tried this solution before. My understanding is, it is not
stream, all dat will be read into memory then transfer to the other end
before we can use it.

Correct me if I am wrong.

"Champika Nirosh" wrote:
I didn't read the link you gave but have a look here

http://msdn.microsoft.com/library/de...3f89f786bd.asp

and receiving part is even more simpler.. assuming that you know how to
create the proxy etc
byte[] response = serviceproxy.GetFile(fileName);
will let you access the binary stream received..

Nirosh.
Note: Please also refer to the sample given with the WSE 3.0.. check the
startup menu items.. under Microsoft WSE 3.0 >Document
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
Thanks for your comment, I read this example from
ms-help://MS.WSE30.1033/WSE3.0/html/3e9ce678-2502-4847-9f13-5173896c9db5.htm
or from MS MSDN
http://msdn.microsoft.com/library/de...73896c9db5.asp

Any idea what should I do?

"Champika Nirosh" <te**@tc.comwrote in message
news:Op**************@TK2MSFTNGP03.phx.gbl...
Hi,

To my knowledge if you are to utilize the WSE MTOM then you got to send
your file as a byte[] not as a custom object at your will.. only the
byte[] will recognize by the Optimization machanism..

The GetFileResponseWrapper will pass olny the single public property it
has.. that is... FileName but in your case that also will not since it
does not have the setter part, since the object serialization/
deserialization is needed the set/ get both to send it via SOAP
successfully... I think you are doing this very veyr wrong..

Since you said you are reading the help I will stop it here...

Nirosh.

object
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:Oq**************@TK2MSFTNGP02.phx.gbl...
Hi all,
I am new to WSE 3.0, and currently reading the document shipped with
installation. From sample provided (see below), I created WSE service
side code, but how can I consume stream returned by web method in my Web
Form application? I already configurated web.config of my web service by
running WSE 3.0 setting tool.

Thanks!
[WebMethod(BufferResponse = false)]
public GetFileResponseWrapper GetStream () {
String filePath = @"e:\temp\70ONEEL06COMP.pdf";
return new GetFileResponseWrapper(filePath);
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.CodeDom.Compiler;

/// <summary>
/// Summary description for GetFileResponseWrapper
/// </summary>
[XmlSchemaProvider("GetMySchema")]
public class GetFileResponseWrapper : IXmlSerializable, IDisposable {
private string _fileName;
private TempFileCollection tfc = null;

public string FileName { get { return _fileName; } }

public GetFileResponseWrapper ()
: this(null) {
}

public GetFileResponseWrapper (string fileName) {
_fileName = fileName;
// Manages the temp file that contains the file contents
// Dispose this wrapper to clean up temp files.
TempFileCollection tfc = new TempFileCollection();
}

#region Dispose logic
~GetFileResponseWrapper () {
Dispose(false);
}

public void Dispose () {
Dispose(true);
}

void Dispose (bool isDisposing) {
if (isDisposing && tfc != null)
tfc.Delete();
tfc = null;
}
#endregion

/// <summary>
/// The schema for the file contents node is actually just
/// base 64 binary data so return the qname of the schema
/// type directly.
/// </summary>
public static XmlQualifiedName GetMySchema (XmlSchemaSet xss) {
return new XmlQualifiedName("Base64Binary",
"http://www.w3.org/2001/XMLSchema");
}

/// <summary>
/// Always return null.
/// </summary>
public XmlSchema GetSchema () { return null; }

/// <summary>
/// Deserializes state out of an XmlReader
/// </summary>
public void ReadXml (XmlReader r) {
// Read the open tag of the encapsulating element
r.ReadStartElement();

//
// Read the binary data that represents the file contents
// into a temp file.
//
_fileName = tfc.AddExtension("fileContents", false);
ReadContentsIntoFile(r, _fileName);

// Read the close tag of the encapsulating element
r.ReadEndElement();
}

/// <summary>
/// Serializes state into an XmlWriter
/// </summary>
public void WriteXml (XmlWriter w) {
using (FileStream fs = new FileStream(_fileName, FileMode.Open))
{
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = fs.Read(buf, 0, 1024)) 0) {
w.WriteBase64(buf, 0, numRead);
}
}
}

void ReadContentsIntoFile (XmlReader r, string fileName) {
using (FileStream fs = new FileStream(fileName,
FileMode.CreateNew)) {
if (r.CanReadBinaryContent) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = r.ReadContentAsBase64(buf, 0, 1024)) >
0) {
fs.Write(buf, 0, numRead);
}
} else {
throw new NotSupportedException();
}
}
}
}


Oct 3 '06 #5

P: n/a
Ops!.. I have not understand the requirement..
ok you want the data to be read while they are transfering..is that the
requirement? but this method is something new to me.. let me do a small R&D
while you are replying..

Nirosh.

"Hardy Wang" <Ha*******@discussions.microsoft.comwrote in message
news:8D**********************************@microsof t.com...
Thanks, I already tried this solution before. My understanding is, it is
not
stream, all dat will be read into memory then transfer to the other end
before we can use it.

Correct me if I am wrong.

"Champika Nirosh" wrote:
>I didn't read the link you gave but have a look here

http://msdn.microsoft.com/library/de...3f89f786bd.asp

and receiving part is even more simpler.. assuming that you know how to
create the proxy etc
byte[] response = serviceproxy.GetFile(fileName);
will let you access the binary stream received..

Nirosh.
Note: Please also refer to the sample given with the WSE 3.0.. check the
startup menu items.. under Microsoft WSE 3.0 >Document
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:%2****************@TK2MSFTNGP05.phx.gbl...
Thanks for your comment, I read this example from
ms-help://MS.WSE30.1033/WSE3.0/html/3e9ce678-2502-4847-9f13-5173896c9db5.htm
or from MS MSDN
http://msdn.microsoft.com/library/de...73896c9db5.asp

Any idea what should I do?

"Champika Nirosh" <te**@tc.comwrote in message
news:Op**************@TK2MSFTNGP03.phx.gbl...
Hi,

To my knowledge if you are to utilize the WSE MTOM then you got to
send
your file as a byte[] not as a custom object at your will.. only the
byte[] will recognize by the Optimization machanism..

The GetFileResponseWrapper will pass olny the single public property
it
has.. that is... FileName but in your case that also will not since
it
does not have the setter part, since the object serialization/
deserialization is needed the set/ get both to send it via SOAP
successfully... I think you are doing this very veyr wrong..

Since you said you are reading the help I will stop it here...

Nirosh.

object
"Hardy Wang" <ha*******@hotmail.comwrote in message
news:Oq**************@TK2MSFTNGP02.phx.gbl...
Hi all,
I am new to WSE 3.0, and currently reading the document shipped
with
installation. From sample provided (see below), I created WSE service
side code, but how can I consume stream returned by web method in my
Web
Form application? I already configurated web.config of my web service
by
running WSE 3.0 setting tool.

Thanks!
[WebMethod(BufferResponse = false)]
public GetFileResponseWrapper GetStream () {
String filePath = @"e:\temp\70ONEEL06COMP.pdf";
return new GetFileResponseWrapper(filePath);
}
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.CodeDom.Compiler;

/// <summary>
/// Summary description for GetFileResponseWrapper
/// </summary>
[XmlSchemaProvider("GetMySchema")]
public class GetFileResponseWrapper : IXmlSerializable, IDisposable {
private string _fileName;
private TempFileCollection tfc = null;

public string FileName { get { return _fileName; } }

public GetFileResponseWrapper ()
: this(null) {
}

public GetFileResponseWrapper (string fileName) {
_fileName = fileName;
// Manages the temp file that contains the file contents
// Dispose this wrapper to clean up temp files.
TempFileCollection tfc = new TempFileCollection();
}

#region Dispose logic
~GetFileResponseWrapper () {
Dispose(false);
}

public void Dispose () {
Dispose(true);
}

void Dispose (bool isDisposing) {
if (isDisposing && tfc != null)
tfc.Delete();
tfc = null;
}
#endregion

/// <summary>
/// The schema for the file contents node is actually just
/// base 64 binary data so return the qname of the schema
/// type directly.
/// </summary>
public static XmlQualifiedName GetMySchema (XmlSchemaSet xss) {
return new XmlQualifiedName("Base64Binary",
"http://www.w3.org/2001/XMLSchema");
}

/// <summary>
/// Always return null.
/// </summary>
public XmlSchema GetSchema () { return null; }

/// <summary>
/// Deserializes state out of an XmlReader
/// </summary>
public void ReadXml (XmlReader r) {
// Read the open tag of the encapsulating element
r.ReadStartElement();

//
// Read the binary data that represents the file contents
// into a temp file.
//
_fileName = tfc.AddExtension("fileContents", false);
ReadContentsIntoFile(r, _fileName);

// Read the close tag of the encapsulating element
r.ReadEndElement();
}

/// <summary>
/// Serializes state into an XmlWriter
/// </summary>
public void WriteXml (XmlWriter w) {
using (FileStream fs = new FileStream(_fileName,
FileMode.Open))
{
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = fs.Read(buf, 0, 1024)) 0) {
w.WriteBase64(buf, 0, numRead);
}
}
}

void ReadContentsIntoFile (XmlReader r, string fileName) {
using (FileStream fs = new FileStream(fileName,
FileMode.CreateNew)) {
if (r.CanReadBinaryContent) {
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = r.ReadContentAsBase64(buf, 0, 1024))
>
0) {
fs.Write(buf, 0, numRead);
}
} else {
throw new NotSupportedException();
}
}
}
}





Oct 4 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.