Web服务在第3次命中时请求超时

时间:2010-11-17 17:33:09

标签: c# httpwebrequest

我编写了一个c#app,将我的数据从Blinksale迁移到Freeagent。这一切都运行正常,我正在适当地进行各种Web服务调用,但是当我作为批处理运行该进程时,它将导入到导入的第3张发票并超时。就像

一样
            Stream dataStream = request.GetRequestStream ();

现在我已经联系了API提供商(Freeagent),他们非常好,他们已经检查了日志,并且前两次尝试(每次都包含3次单独调用),但没有任何迹象表明第3次请求。这将使它成为关于此Web服务的第8个请求,但在此之前可能有相当多的代码使用类似的代码来获取数据。

因此我假设它与我的.net代码有关。

我很难分享任何片段,因为有很多事情要发生,但基本上我多次做同样的事情。

N.B。我已经检查过,它不是第3个请求中的数据有问题(我跳过它的结果相同)

// Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create ("http://www.contoso.com/PostAccepter.aspx ");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            string postData = "This is a test that posts this string to a Web server.";
            byte[] byteArray = Encoding.UTF8.GetBytes (postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream ();
            // Write the data to the request stream.
            dataStream.Write (byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close ();
            // Get the response.
            WebResponse response = request.GetResponse ();
            // Display the status.
            Console.WriteLine (((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream ();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader (dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd ();
            // Display the content.
            Console.WriteLine (responseFromServer);
            // Clean up the streams.
            reader.Close ();
            dataStream.Close ();
            response.Close ();

3 个答案:

答案 0 :(得分:4)

你明确关闭所有内容 - 这意味着如果抛出任何异常,你将不会关闭事物。对using和所有涉及的流使用WebResponse语句。通常“网络请求超时第三次尝试”问题 由于连接没有被正确关闭......虽然看起来你关闭了所有东西,但在成功的情况下,可能会有一些微妙之处参与其中。 using语句更加健壮。

例如:

string responseText;
using (WebResponse response = request.GetResponse())
{
    Console.WriteLine (((HttpWebResponse)response).StatusDescription);
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    {
        responseText = reader.ReadToEnd(responseText);
    }
}
Console.WriteLine(responseText);

答案 1 :(得分:2)

哇,这么多代码。试试这个:

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "key", "This is a test that posts this string to a Web server." }
    };
    string url = "http://www.contoso.com/PostAccepter.aspx";
    byte[] result = client.UploadValues(url, values);
    Console.WriteLine(Encoding.UTF8.GetString(result));
}

如果这不起作用,则是网络和/或服务器问题。您还可以通过在app / web.config中添加以下内容来激活客户端上的日志,以确切了解HTTP堆栈上发生的情况:

<system.diagnostics>
  <sources>
    <source name="System.Net" tracemode="protocolonly">
      <listeners>
        <add name="System.Net" type="System.Diagnostics.TextWriterTraceListener" initializeData="network.log" />
      </listeners>
    </source>
  </sources>

  <switches>
    <add name="System.Net" value="Verbose"/>
  </switches>

  <trace autoflush="true" />
</system.diagnostics>

答案 2 :(得分:0)

我遇到了tigermain提到的同样的问题,感谢Darin,我设法使用以下解决方案:

using(WebClient client = new WebClient()){
      string url = "http://example.org/post";
      int id = 1;
      string dataFormat = "data={{\"Id\":{0} }}";
      string dataString = string.Format (dataFormat, id);
      byte[] data = ASCIIEncoding.ASCII.GetBytes(dataString);
      client.UploadData(url, "POST", data); 
}

这会向http://example/post发送一条带有您数据的POST HTTP请求(在此示例中只是一个静态ID);

您可能不需要格式化字符串中的整个data={},因此如果它不适合您,请使用它。