473,503 Members | 1,649 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

HttpWebRequest.Abort() does not stop network traffic

Hi,

I have a background worker in my C# app that makes a synchronous
HttpWebRequest.GetResponse() call. The idea is to POST a file to a
server on the internet. When I call HttpWebRequest.Abort() on the
request object on another thread, GetResponse() returns with an
exception as expected. However, when I monitor the network traffic, it
does not seem to stop, but to continue to be active and to upload the
file. The network is active even after I close down my application
completely and the file will be posted to the server even if that takes
another few minutes.

My expectation was that with calling Abort(), GetResponse() would return
with an exception and all network traffic that relates to this upload
would stop, but it seems that I am wrong here. Has anyone an idea why
this is the case?

Thanks and best wishes,

Marc.
Aug 1 '07 #1
7 7650
"Marc Bartsch" <m.*******@reading.ac.ukwrote in message
news:4i*****************@newsfe5-win.ntli.net...
Hi,

I have a background worker in my C# app that makes a synchronous
HttpWebRequest.GetResponse() call. The idea is to POST a file to a
server on the internet. When I call HttpWebRequest.Abort() on the request
object on another thread, GetResponse() returns with an exception as
expected. However, when I monitor the network traffic, it does not seem to
stop, but to continue to be active and to upload the file. The network is
active even after I close down my application completely and the file will
be posted to the server even if that takes another few minutes.

My expectation was that with calling Abort(), GetResponse() would return
with an exception and all network traffic that relates to this upload
would stop, but it seems that I am wrong here. Has anyone an idea why this
is the case?
If I understand you correctly, you've already POSTed a file to the server,
and you've issued the GetResponse, yet when you abort it, the server keeps
sending you data?

Why should it stop? Answer: it should not stop, as nobody has told it to
stop. No message traveled from the client to the server saying: stop.

In fact, I don't believe that there _is_ such a message that can be sent. At
best, the TCP connection could be closed, but the server may not detect that
until it does a read from the connection.

Please confirm my understanding of your issue, and provide more detail of
the configuration. In particular, what software is running on client and
server, what versions, etc.
--
John Saunders [MVP]

Aug 1 '07 #2
Hi,

I just wanted to add that I tried everything in an asynchronous manner
and I got the same problem. The request will be aborted (in fact
exceptions are not thrown - I think I was wrong about that in my earlier
post), but the network is still busy uploading the file.

Marc.

Marc Bartsch schrieb:
Hi,

I have a background worker in my C# app that makes a synchronous
HttpWebRequest.GetResponse() call. The idea is to POST a file to a
server on the internet. When I call HttpWebRequest.Abort() on the
request object on another thread, GetResponse() returns with an
exception as expected. However, when I monitor the network traffic, it
does not seem to stop, but to continue to be active and to upload the
file. The network is active even after I close down my application
completely and the file will be posted to the server even if that takes
another few minutes.

My expectation was that with calling Abort(), GetResponse() would return
with an exception and all network traffic that relates to this upload
would stop, but it seems that I am wrong here. Has anyone an idea why
this is the case?

Thanks and best wishes,

Marc.
Aug 1 '07 #3
Hi John,

Thanks a lot for your post. My configuration is: .NET 2.0.50727, Visual
Studio 2005 and I am using C#. I don't know anything about the server
other than I can POST files to a URI. Also, the way I am using
HttpWebRequest is taken from the MSDN pages. The actual Abort() in my
application works ok, but the upload does not stop.

I am not quite sure what you mean by:
If I understand you correctly, you've already POSTed a file to the
server, and you've issued the GetResponse, yet when you abort it, ...
My understanding so far was that calling GetResponse starts the actual
POSTing of the file, because this is when I see the network becoming
quite busy, but I may be wrong here. From your sentence above I gather
that POSTing to the server occurs before calling GetResponse, maybe when
I write to the request stream? And GetResponse only waits for the
response from the server. Is that correct?

I think your understanding of my problem is correct, but it is not the
server that keeps sending data, it seems that my machine keeps sending
data to the server. When I start my app and I abort the upload a few
seconds later, a 1.6 MB file will still be uploaded.

Here is a short code snippet. This is an async version. The scenario is:
My Background worker thread calls Upload and then the GUI thread calls
Abort. BeginGetResponse will be aborted correctly, but the file keeps on
being uploaded.

public void Abort()
{
this.req.Abort();
}

public void Upload(Uri uri)
{
try
{
this.req = (WebRequest.Create(uri) as HttpWebRequest);
this.req.Method = "POST";

this.postData = new MemoryStream();

/* Create data to POST */

this.req.ContentLength = this.postData.Length;
this.req.BeginGetRequestStream(
new AsyncCallback(ReadCallback), this.req);

allDone.WaitOne();
allDone.Reset();

IAsyncResult rest = this.req.BeginGetResponse(new
AsyncCallback(RespCallback), this.req);

allDone.WaitOne();
}
catch (Exception exc)
{
Console.WriteLine("WebRequest aborted");
Console.WriteLine(exc.Message);
}
}

// First Callback
private void ReadCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

using (Stream s = request.EndGetRequestStream(asynchronousResult))
this.postData.WriteTo(s);
this.postData.Close();

allDone.Set();
}

// Second Callback
private void RespCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest request =
(HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response =
(HttpWebResponse)request.EndGetResponse(asynchrono usResult);

StreamReader sr = new StreamReader(response.GetResponseStream());
string strResp = sr.ReadToEnd().Trim();

allDone.Set();
}
catch (WebException e)
{
Debug.WriteLine("\nRespCallback Exception raised!");
Debug.WriteLine("\nMessage:{0}", e.Message);
}
}

Thanks again for your help.

Best wishes,

Marc.

John Saunders [MVP] schrieb:
"Marc Bartsch" <m.*******@reading.ac.ukwrote in message
news:4i*****************@newsfe5-win.ntli.net...
>Hi,

I have a background worker in my C# app that makes a synchronous
HttpWebRequest.GetResponse() call. The idea is to POST a file to a
server on the internet. When I call HttpWebRequest.Abort() on the
request object on another thread, GetResponse() returns with an
exception as expected. However, when I monitor the network traffic, it
does not seem to stop, but to continue to be active and to upload the
file. The network is active even after I close down my application
completely and the file will be posted to the server even if that
takes another few minutes.

My expectation was that with calling Abort(), GetResponse() would
return with an exception and all network traffic that relates to this
upload would stop, but it seems that I am wrong here. Has anyone an
idea why this is the case?

If I understand you correctly, you've already POSTed a file to the
server, and you've issued the GetResponse, yet when you abort it, the
server keeps sending you data?

Why should it stop? Answer: it should not stop, as nobody has told it to
stop. No message traveled from the client to the server saying: stop.

In fact, I don't believe that there _is_ such a message that can be
sent. At best, the TCP connection could be closed, but the server may
not detect that until it does a read from the connection.

Please confirm my understanding of your issue, and provide more detail
of the configuration. In particular, what software is running on client
and server, what versions, etc.
Aug 1 '07 #4
"Marc Bartsch" <m.*******@reading.ac.ukwrote in message
news:u_******************@newsfe6-gui.ntli.net...
Hi John,

Thanks a lot for your post. My configuration is: .NET 2.0.50727, Visual
Studio 2005 and I am using C#. I don't know anything about the server
other than I can POST files to a URI. Also, the way I am using
HttpWebRequest is taken from the MSDN pages. The actual Abort() in my
application works ok, but the upload does not stop.

I am not quite sure what you mean by:
If I understand you correctly, you've already POSTed a file to the
server, and you've issued the GetResponse, yet when you abort it, ...

My understanding so far was that calling GetResponse starts the actual
POSTing of the file, because this is when I see the network becoming quite
busy, but I may be wrong here. From your sentence above I gather that
POSTing to the server occurs before calling GetResponse, maybe when I
write to the request stream? And GetResponse only waits for the response
from the server. Is that correct?

I think your understanding of my problem is correct, but it is not the
server that keeps sending data, it seems that my machine keeps sending
data to the server. When I start my app and I abort the upload a few
seconds later, a 1.6 MB file will still be uploaded.

Here is a short code snippet. This is an async version. The scenario is:
My Background worker thread calls Upload and then the GUI thread calls
Abort. BeginGetResponse will be aborted correctly, but the file keeps on
being uploaded.
Thanks for posting the code. I think I understand your problem now.

You are mixing asynchronous and synchronous operations. Although you use the
async methods on the HttpWebRequest/Response, you are writing your data
synchronously.

By the time you abort the response, you've already passed your data to .NET!

First, try aborting the Request, and not the response. That probably won't
work. I would then suggest going completely asynchronous, using a series of
async BeginWrite calls to write the file. Set a flag in your class instance
to indicate when it's time to abort. Have your completion routine for the
BeginWrite check the flag before starting another write.
--
John Saunders [MVP]

Aug 1 '07 #5
Hi John,

Well, the penny has finally dropped. I think your solution seems the
only way to go. I did not realise that I should write to the request
stream in chunks and check for an abort in between.

Thanks for helping to solve this problem and also for clearing up my
misunderstanding of HTTP POST and HttpWebRequest.

Best wishes,

Marc.

John Saunders [MVP] schrieb:
>
Thanks for posting the code. I think I understand your problem now.

You are mixing asynchronous and synchronous operations. Although you use
the async methods on the HttpWebRequest/Response, you are writing your
data synchronously.

By the time you abort the response, you've already passed your data to
.NET!

First, try aborting the Request, and not the response. That probably
won't work. I would then suggest going completely asynchronous, using a
series of async BeginWrite calls to write the file. Set a flag in your
class instance to indicate when it's time to abort. Have your completion
routine for the BeginWrite check the flag before starting another write.
Aug 2 '07 #6
"Marc Bartsch" <m.*******@reading.ac.ukwrote in message
news:ZH******************@newsfe5-win.ntli.net...
Hi John,

Well, the penny has finally dropped. I think your solution seems the only
way to go. I did not realise that I should write to the request stream in
chunks and check for an abort in between.
Glad to help.

BTW, is this abort scenario something that will happen often? If not, you
might consider leaving the code as-is.
--
John Saunders [MVP]

Aug 2 '07 #7
John Saunders [MVP] schrieb:
"Marc Bartsch" <m.*******@reading.ac.ukwrote in message
news:ZH******************@newsfe5-win.ntli.net...
>Hi John,

Well, the penny has finally dropped. I think your solution seems the
only way to go. I did not realise that I should write to the request
stream in chunks and check for an abort in between.

Glad to help.

BTW, is this abort scenario something that will happen often? If not,
you might consider leaving the code as-is.
Hi John,

the abort scenario will only occur if the user decides to stop a file
upload maybe when the file is too large or so. This will not occur too
often I guess.

Thanks again,

Marc.
Aug 2 '07 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
7351
by: Stephan Steiner | last post by:
Hi I'm having some weird threading issues.. almost at random, if I dare change a line of my code, the shutdown sequence gets messed up. I'm using a thread to receive data from the network, that...
7
3264
by: Morris | last post by:
I want to abort a running thread, so I call MyThread.abort() function. My problem is this thread runs "almost" like a while(true) loop and I don't want the Abort() function interrupts the thread at...
5
3121
by: [Yosi] | last post by:
Why I can't abot a susspended thread. Who can terminat a thread imediatly without consider to its stat or execution?
2
4799
by: Keith Patrick | last post by:
I'm trying to programmatically post data to another page within my ASP.Net app. Not POSTing is not an option (I can't store this data in my session, context, hidden fields, or anything else...I've...
1
2587
by: sfoxover | last post by:
Hi, Could someone please give me some suggestions on how to make this class robust. I need to be able to handle around 20 similtanious requests to this class which causes a web browser to...
0
1423
by: a_newcomb | last post by:
I have an application which polls and connects to a webserver on a background thread. When the application is supposed to exit, I call abort on the HttpWebRequest object. I have observed that...
13
2400
by: Shailesh Humbad | last post by:
Here is an advanced PHP question. Can anyone think of a way to detect the number of bytes written to output when a script is aborted? I am sending a large file to the client, and I want to record...
6
5430
by: Joe HM | last post by:
Hello - I have a function that calls Thread.Abort() to stop a thread in a _Closed() Method of a GUI. The thread contains a blocking call on a TCP socket and that is the easiest way to stop...
7
7761
by: raids51 | last post by:
Hello, i have a program that downloads a file using the httpwebrequest/response, and it usually works, but sometimes it will freeze at a random part of the download without an error. here is the...
0
7072
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7319
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
6979
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
7449
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
5570
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
1
4998
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
3160
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
1
730
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
373
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.