Веб-сервис запрашивает тайм-аут при третьем попадании - PullRequest
1 голос
/ 17 ноября 2010

Я написал приложение ac # для переноса моих данных из Blinksale во Freeagent.Все это работает нормально, и я выполняю различные вызовы веб-службы соответствующим образом, однако, когда я запускаю процесс как пакет, он получает 3-й счет по импорту и время ожидания.Примерно как

            Stream dataStream = request.GetRequestStream ();

Теперь я связался с провайдером API (Freeagent), который очень хорош, проверил логи, и сделаны первые 2 попытки (которые состоят из 3 отдельныхзвонит каждому) но нет никаких признаков 3-го запроса.Это сделало бы это о восьмом запросе к этому веб-сервису, но, возможно, довольно многие использовали подобный код до этого для получения данных.

Поэтому я предполагаю, что это как-то связано с моим.net code.

Мне сложно делиться какими-либо фрагментами, поскольку так много всего происходит, но по сути я делаю то же самое, что и это несколько раз.

NB Я проверил, и этоРазве это не данные в 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 ]

4 голосов
/ 17 ноября 2010

Вы закрываете все явно - это означает, что если выбрасываются какие-либо исключения, вы не будете закрывать вещи. Используйте операторы 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);
2 голосов
/ 17 ноября 2010

Ух, так много кода. Попробуйте это:

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>
0 голосов
/ 08 апреля 2011

У меня была та же проблема, о которой упоминал tigermain, и благодаря Дарину мне удалось заставить его работать со следующим решением:

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); 
}

Это сделает запрос POST HTTP к http://example/post с вашими данными(в данном примере это просто статический идентификатор);

Вам может не понадобиться целое data={} в строке форматирования, поэтому поэкспериментируйте с этим, если он не работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...