Problem zwischen Anwendung und Webservice

28/02/2008 - 12:35 von martina gerling | Report spam
Guten Tag,

ich habe mal wieder ein kleines Problem, bei welchem ich keine Lösung
finde.

Ich habe vor làngerer Zeit eine Anwendung geschrieben, welche per
Webservice Dateien von meinem Rechner ins Netz übertràgt. Mir ist
heute aufgefallen, dass eine Datei mit 130 MB nicht übertragen wird
(ohne Fehlermeldung) und bei einer Datei von 180 MB kam die
Fehlermeldung:
"Eine Ausnahme vom Typ System.OutOfMemoryException wurde ausgelöst.".
Bisher hatte ich immer nur Dateien so um die 50-80 MB, was auch gut
geklappt hat.

Ich finde im Moment keinen Ansatz, wo der Fehler sein kann bzw. wie
ich ihn behebe.

Könnt ihr mir weiterhelfen? Hier mal mein Code:

**********************************************************************************************************
[Client:]
**********************************************************************************************************
delegate bool Uebertragen(string sname, byte[] barray, DateTime
dtime);
private void Upload(string filename, string projectname)
{
if (filename.Trim() != "")
{
Uebertragen uebertragen = wsv.SaveFileToServer;
try
{

FileInfo fi = new FileInfo(Path.Combine(
Application.StartupPath,
filename.Trim()));

DateTime filedatetime = fi.LastWriteTime;

string name;

if (projectname.Trim() == "")
name = filename.Trim();
else
name = projectname.Trim();

long groesse = fi.Length;

if (!wsv.IsFileOK(name, groesse, filedatetime))
{
bool ende = false;
do
{
FileStream fs = new FileStream(
Path.Combine(Application.StartupPath,
filename.Trim()),
FileMode.Open,
FileAccess.Read);
long FileSize = fs.Length;
byte[] b = new byte[(int)FileSize];
fs.Read(b, 0, (Int32)FileSize);
fs.Close();

IAsyncResult iaresult uebertragen.BeginInvoke(
name, b, filedatetime,
Callback, uebertragen);

progressBar1.Value = 0;
int progress = 0;

bool done = false;
do
{
done iaresult.AsyncWaitHandle.WaitOne(200, true);
if (progress == 100)
{
progress = 1;
}
progressBar1.Value = progress;
progress++;
Application.DoEvents();
}
while (!done);
progressBar1.Value = 100;
Thread.Sleep(300);
progressBar1.Value = 0;
if (wsv.IsFileOK(name, groesse,
filedatetime))
{
ende = true;
}
else
{
ende = false;
}

} while (!ende);
}
else
{
}

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

static void Callback(IAsyncResult iaresult)
{
Uebertragen uebertragen (Uebertragen)iaresult.AsyncState;

try
{
bool empfang = uebertragen.EndInvoke(iaresult);
}
catch
{ }
}
*********************************************************************************************************
[WebService]
*********************************************************************************************************
[WebMethod]
public bool IsFileOK(string sFileName, long groesse, DateTime
dt)
{
string sDatei = Path.Combine(Server.MapPath("~"),
sFileName);
FileInfo fi = new FileInfo(sDatei);

if (fi.Exists && fi.Length == groesse && fi.LastWriteTime
== dt)
{
return true;
}
return false;
}

[WebMethod]
public bool SaveFileToServer(string sFileName, byte[]
bFileByte,DateTime dt)
{

string sDatei = Path.Combine(Server.MapPath("~"),
sFileName);
FileInfo fi = new FileInfo(sDatei);

try
{

string[] datei = sFileName.Split(new Char[] { '\\' });

string temp = Server.MapPath("~");

for (int i = 0; i < datei.Length - 1; i++)
{
temp += "\\" + datei[i];
if (!Directory.Exists(temp))
Directory.CreateDirectory(temp);

}

MemoryStream ms = new MemoryStream(bFileByte);
FileStream fs = new FileStream(sDatei,
FileMode.Create);
ms.WriteTo(fs);
ms.Close();
fs.Close();
fi.LastWriteTime = dt;
}
catch
{
return false;
}

return true;
}


Bis bald

Martina
 

Lesen sie die antworten

#1 Frank Dzaebel
28/02/2008 - 22:31 | Warnen spam
Hallo Martina,

Ich habe vor làngerer Zeit eine Anwendung geschrieben, welche per
Webservice Dateien von meinem Rechner ins Netz übertràgt. Mir ist
heute aufgefallen, dass eine Datei mit 130 MB nicht übertragen wird
(ohne Fehlermeldung) und bei einer Datei von 180 MB kam die
Fehlermeldung: [...]



Zunàchst würde assoziiert man evtl. MTOM [WSE 3]:

[How to: Enable a Web Service to Send and Receive Large Amounts of Data]
http://msdn2.microsoft.com/en-us/li...28822.aspx

[Sending Large Amounts of Data in a SOAP Message Using WSE]
http://msdn2.microsoft.com/en-us/li...29567.aspx

[How to: Stream Large Amounts of Data from a Web Service]
http://msdn2.microsoft.com/en-us/li...28818.aspx

[Visual Studio Magazine Online | Getting Started: Implement a File Transfer
Web Service]
http://visualstudiomagazine.com/col...itorialsid 22

[CodeProject: Sending Files in Chunks with MTOM Web Services and .NET 2.0.]
http://www.codeproject.com/KB/XML/M...vices.aspx

____________
Jedoch gibt es ja nun schon eine "gewisse" Zeit WCF.
Bei einem Webdienst, der von WSE 3.0 zu WCF migriert
wird, kann man noch mal eine Leistungsverbesserung von bis
zu 200- bis 400 % erreichen.

[Migrieren von WSE 3.0-Webdiensten zu WCF]
http://msdn2.microsoft.com/de-de/li...32008.aspx

[MSDN Webcast: Windows Communication Foundation Top to Bottom (Part 07 of
15): Messaging Patterns (Level 200)]
https://msevents.microsoft.com/CUI/...mp;EventID32344343&CountryCode=US&IsRedirect=false

Vielleicht kannst Du ja kurz dazu etwas sagen ...
ob das überhaupt in Frage kommt.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen