c # много асинхронных HttpWebRequest - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь сделать много асинхронных HttpWebRequest.Это мой тестовый код:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    public static async void Test()
    {
        for (int i = 0; i < 10; i++)
        {
            int val = i;
            await Task.Run(() => WR(val));
        }
    }

    static async void WR(int msg)
    {
        Console.WriteLine(msg + " begin");

        string url = "https://stackoverflow.com";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>
                (request.BeginGetResponse, request.EndGetResponse, null);

        Console.WriteLine(msg + " status code: " + response.StatusCode);
        Console.WriteLine(msg + " end");
    }
}

Результат этого:

0 begin
1 begin
2 begin
3 begin
4 begin
5 begin
6 begin
7 begin
8 begin
9 begin
0 status code: OK
0 end
1 status code: OK
1 end

И после 1 end ничего не происходит.Примерно через 30 секунд на выходе я вижу:

The thread 0x6634 has exited with code 0 (0x0).
The thread 0x5620 has exited with code 0 (0x0).
The thread 0x4d08 has exited with code 0 (0x0).
The thread 0x39b8 has exited with code 0 (0x0).
The thread 0x3454 has exited with code 0 (0x0).
The thread 0x99c has exited with code 0 (0x0).
The thread 0x6be0 has exited with code 0 (0x0).

Но нет никаких исключений, и консоль не закрывается.

Где моя ошибка?

ОТВЕТ:

Не помню response.Dispose();

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Буду ли я превращать его в свой собственный статический метод, который будет возвращать строку, чтобы вы могли видеть, что происходит.и я бы не стал полагаться на XML-файл любого вида, если только он не является XML, возвращаемым из вызова API.Я размещаю здесь, но вы можете получить, если хотите.Не уверен, как ваши настройки на заднем конце.Проверьте это:

public static string PostXMLDataCS()
    {
        bool debugging = false;
        try
        {

            string iConnectAuth = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
  "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">" +
            "<soapenv:Header/>" +
       "<soapenv:Body>" +
        "<tem:Authenticate>" +
         "<!--Optional:-->" +
          "<tem:TenantID>TenantID</tem:TenantID>" +
               "<!--Optional:-->" +
                "<tem:Username>Username</tem:Username>" +
                     "<!--Optional:-->" +
                      "<tem:Password>password</tem:Password>" +
                           "</tem:Authenticate>" +
                            "</soapenv:Body>" +
                             "</soapenv:Envelope>";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com/services/ByDesign/Inventory.svc");
            byte[] bytes;
            bytes = System.Text.Encoding.ASCII.GetBytes(iConnectAuth);

            request.ContentType = "text/xml; charset=utf-8";
            request.Accept = "gzip,deflate";
            request.ContentLength = bytes.Length;
            request.Method = "POST";
            request.Headers.Add("SOAPAction", "http://tempuri.org/IInventory/Authenticate");
            request.KeepAlive = true;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            HttpWebResponse response;
            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream responseStream = response.GetResponseStream();
                string responseStr = new StreamReader(responseStream).ReadToEnd();
                response.Close();
                //MessageBox.Show(responseStr);
                return responseStr;
            }
        }
        catch (Exception e)
        {
            if (debugging == true)
            {
                MessageBox.Show("There was a problem authenticating for the check inventory with iConnect. Error: " + e);
            }

            string messageSubject = "There was a problem authenticating for the check inventory with iConnect.";
            string messageBody = "There was a problem authenticating for the check inventory with iConnect. Error: ";
            string kiboSendEmail = string.Empty;
            SendEmail sendEmail = new SendEmail();
            return kiboSendEmail = sendEmail.SendEmailCS(messageSubject, messageBody, e);

        }
        return null;
    }
0 голосов
/ 14 сентября 2018

Не помню response.Dispose();

static async void WR(int msg)
{
    Console.WriteLine(msg + " begin");

    string url = "https://stackoverflow.com";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>
            (request.BeginGetResponse, request.EndGetResponse, null);

    Console.WriteLine(msg + " status code: " + response.StatusCode);
    Console.WriteLine(msg + " end");
    response.Dispose();
}
0 голосов
/ 13 сентября 2018

Я запустил ваш код и получил вывод, как показано ниже:

0 begin
1 begin
2 begin
3 begin
4 begin
5 begin
6 begin
7 begin
8 begin
9 begin
0 status code: OK
0 end
5 status code: OK
5 end
8 status code: OK
8 end
4 status code: OK
4 end
3 status code: OK
3 end
2 status code: OK
2 end
6 status code: OK
6 end
1 status code: OK
1 end
7 status code: OK
7 end
9 status code: OK
9 end

И когда вы нажмете Enter, приложение закроется из-за Console.ReadLine(); в вашем основном методе. Программа ждет, пока не получит ввод с вашей консоли.

...