request.GetResponse (), кажется, зависает моя программа - PullRequest
0 голосов
/ 30 сентября 2018

Я работал над проектом, который получает результаты с остальных серверов через httprequests.В этом случае я попытался и преуспел (вчера этот же код работал.) В поиске страны и получении ее флага для dipslay.

Я сузил, что функция "makeRequest" вешает мою программу.

повесив трубку, я имею в виду, что я не могу даже закрыть форму, нажав «x» в правом верхнем углу, и вынужден принудительно выйти, нажав «stop debugg».

Любые намеки на то, что я делаю неправильно или пошло не так, будут с благодарностью.

Код, используемый в форме:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ApiQueryHandler
{
abstract class QueryCreator
{

    static public string createQueryLandcode(String country)
    {
        string queryStandaard = "https://restcountries.eu/rest/v2/name/";
        string queryLandCode = "?fields=alpha2Code";
        string query = queryStandaard + country + queryLandCode;
        return query;
    }
    static public string makeRequest(string query)
    {
        WebRequest request = WebRequest.Create(query);
        request.Credentials = CredentialCache.DefaultCredentials;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();
        return responseFromServer;
    }
    static public string createQueryFlag(string country)
    {
        string queryStandaard = "https://restcountries.eu/rest/v2/name/";
        string queryFlag = "?fields=flag";
        string query = queryStandaard + country + queryFlag;
        return query;
    }
    static public string getSVGFlagUrl(string queryResponseFlag)
    {
        String beginUrl = queryResponseFlag.Substring(10);
        int endUrl = beginUrl.IndexOf('"');
        String url = queryResponseFlag.Substring(10,endUrl);
        return url;
    }
    static public string getPNGFlagUrl(string landCode)
    {
        string PNGUrl = "https://www.countryflags.io/"+landCode+"/flat/64.png";
        return PNGUrl;
    }
    static public string getCode(string queryResponseCode)
    {
        String beginCode = queryResponseCode.Substring(16);
        int endCode = beginCode.IndexOf('"');
        String code = queryResponseCode.Substring(16, endCode);
        return code;
    }
    static public string getCodeShort(string queryResponseCode)
    {
        String beginCode = queryResponseCode.Substring(10);
        int endCode = beginCode.IndexOf('"');
        String code = queryResponseCode.Substring(10, endCode-1);
        return code;
    }
}

}

Код формы:

private void textBoxCounrty_TextChanged(object sender, EventArgs e)
    {
        string country = textBoxCountry.Text;
        string queryLandcode = QueryCreator.createQueryLandcode(country);
        string queryFlag = QueryCreator.createQueryFlag(country);
        try
        {

            string responseLandcode = QueryCreator.makeRequest(queryLandcode);
            string responseFlag = QueryCreator.makeRequest(queryFlag);
            string SVGUrl = QueryCreator.getSVGFlagUrl(responseFlag);
            labelURLQuery.Text = queryLandcode;
            string processedLandcode = QueryCreator.getCode(responseLandcode);
            string PNGUrl = QueryCreator.getPNGFlagUrl(processedLandcode);
            richTextBoxServerResponse.Text = responseLandcode+"\n\n"+processedLandcode+"\n\n"+PNGUrl+"\n\n"+SVGUrl;
            pictureBoxFlag.Load(PNGUrl);
            labelERROR.Text = "";
        }
        catch (WebException)
        {
            labelERROR.Text = "404 not found";
        }
        catch (ArgumentException)
        {
            labelERROR.Text = "404 not found";
        }

    }

Ответы [ 2 ]

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

кажется, что https://restcountries.eu (сервер остальных, на которые я отправляю запросы, не отвечает)

при использовании других серверов остальных, таких как http://countryapi.gear.host мой код (оригинал) делаетработа.

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

сделайте ваш запрос асинхронным

public async Task<string> makerequest(string query){

}

, затем, когда вы его вызовите, используйте модификатор await

string response= await makerequest(yourstring)

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

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