views:

575

answers:

3

After googling for couple of days, I really cannot solve described issue. Hope here will find a solution

I'm using attached code when calling WCF service on the same server. I get Timeout error randomly in call WebReq.GetRequestStream()

When I'm check netstat I see that connection remains open, so probably is there a problem, but I don't know how to solve it

       //request inicialization
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
        WebReq.Method = "POST";
        WebReq.ContentType = "application/json; charset=utf-8";
        WebReq.ContentLength = buffer.Length;

        WebReq.Proxy = null;
        WebReq.KeepAlive = false; //also tried with true
        WebReq.AllowWriteStreamBuffering = false; //also tried with true

        //this produces an error
        using (Stream PostData = WebReq.GetRequestStream())
        {
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();
        }

         //open and read response
         HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
         Stream Answer = WebResp.GetResponseStream();
         StreamReader _Answer = new StreamReader(Answer);

         WebResp.Close();

         //return string
         return _Answer.ReadToEnd();

Timeout is thrown mostly after some 10 seconds of idle time, but also after five or so requests in the row. Really cannot find a pattern.

What could be wrong with this code? Is there any other (better) way for calling WCF service?

+2  A: 

I don't know that it's definitely responsible for the problem, but you're only closing the web response if it doesn't throw an exception, and you're never closing the response stream. Use using statements:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream())
{
    return reader.ReadToEnd();
}

This could well explain the problem, as if you leave a response open it will keep the connection to the web server open - which means connection pooling then can't use that connection.

Jon Skeet
It's a bit better, but I'm still getting timeouts. So, it's really strange.So after 1st link click is Loading and Loading and if in that time click on the same or any other link on the page then page loads in the second or so. So there is something wrong with Connection creation. As I suppose
AnzeR
I hadn't spotted that it was on the same machine... I wonder whether you're running out of thread pool threads - are these within the same process?
Jon Skeet
I'm quite new in .net programming. Have been programming in PHP for some years now, and there never notice such a problems. There are this things much much easier.So I 'm not sure what did you mean with "out of thread pool threads"? Withing one request I create two or so this HTTP request to WCF service, so it's withing same process/request. Should I use caching for this requests?
AnzeR
@AnzeR: I believe WCF will serve requests from the thread-pool; if you're calling into a service from itself, you could end up deadlocking if there are no more thread-pool threads free. You haven't really explained what the calling code is - is it within the same service, or is it a separate application?
Jon Skeet
Hm, I'm really not familiar with all this IIS settings. WEB and WCF resist withing same Application Pool, they are in the same Site, but set as different Application
AnzeR
@AnzeR: I would put some more tracing into your code - find out exactly where it's pausing. If you're currently just seeing it because the "outer" call is timing out, you don't really have enough information to analyze it yet.
Jon Skeet
If I run application in debug mode it stops on Stream PostData = WebReq.GetRequestStream() and after minute or two throw Timeout exception. This should be result of some previous request, but really don't know which one.
AnzeR
@AnzeR: GetRequestStream... okay, so again I suspect it's failing to connect. This may be due to some "maximum concurrent connection" limit within IIS which I'm not familiar with :(
Jon Skeet
I'm not sure that it's connection problem. Because it's not dependent to number of established TCP connection. I pasted debug log http://pastebin.com/m1aebd069, so there should be something useful
AnzeR
We are still getting timeouts. Probably we have to tall methods in WCF directly (it's possible because they are hosted together) and not through HTTP POST requests. It should also work much faster.\nIt also strange that calls to this (the same one) services via Jquery Ajax works really smooth, and there is no problems.
AnzeR
A: 

Because this is really strange behaviour I would like to know if there are any other ways to call WCF service, hosted on same IIS server. I also thing, that creating TCP connection for that kind of calls in not really optimized and all other approaches should be much faster.

AnzeR
A: 

Is this a console application, or a GUI application? If so, create a system.net log of your application, and post the log on pastebin.com. We can take a look.

Usually timeouts occur because you dont dispose of the HttpWebResponse object. However, looks like this is not the case here. A system.net log of the appplication will help show the cause.

feroze
Here is the link from Event Viewer: http://pastebin.com/m1aebd069
AnzeR
I meant that you should create a system.net log (as per the link I gave you). Anyhow, I notice from the call stack that this is a middle-tier application.Also, you said that the ASPX page is in turn calling a WCF service on the same server. Therefore you are probably running out of free connections to use.To resolve this, set ServicePointManager.DefaultConnectionLimit = 100 and retry. If it happens again, you might have to experiment with different values for the connection limit.
feroze