Соединение Android с WCF сбрасывается одноранговым узлом

У меня есть приложение для Android, которое использует службы WCF, вот фрагмент кода из AsyncTask:

private HttpEntity<HashMap> request(){
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Cookie", LocalData.Web.getCookie(this.context));

        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());

        HttpEntity<HashMap> requestDataEntity = new HttpEntity<>(request, requestHeaders);

        HttpEntity<HashMap> response = restTemplate.exchange(this.url, this.httpMethod, requestDataEntity, HashMap.class);


//        HttpHeaders headers = response.getHeaders();
//        LocalData.Web.storeCookie(headers, context);

        return response;
    }

    @Override
    protected HashMap doInBackground(Void... voids) {
        try{
            return request().getBody();
        }
        catch (Exception e){
            Log.e("error", e.getMessage());
            return null;
        }

    }

в основном он правильно подключается к этой службе, но иногда здесь возникает какое-то исключение, которое получает это сообщение:

Ошибка ввода-вывода: ошибка recvfrom: ECONNRESET (сброс соединения узлом); вложенным исключением является java.net.SocketException: ошибка recvfrom: ECONNRESET (сброс соединения узлом)

что может вызвать эту ошибку?

Примечание.

Долгое время все работало нормально, но теперь у меня часто возникает эта проблема. Это проблема с Android или я бы искал проблему на стороне WCF?


person godot    schedule 13.02.2018    source источник


Ответы (1)


попробуйте установить HttpURLConnection перед подключением:

conn.setRequestProperty("connection", "close");

Также вы можете просмотреть эту ссылку. Android поддерживает пул соединений и использует сначала старый, поэтому, установив это свойство, вы отключите свойство keep-alive, которое включено по умолчанию.

Для этого вам необходимо создать RestTemplateHttpComponentsClientHttpRequestFactor

@Bean
RestTemplate restTemplate(SimpleClientHttpRequestFactory factory) {
   return new RestTemplate(factory);
}

Проверьте эту ссылку

и этот

person Abdul Kawee    schedule 13.02.2018
comment
где мне это написать? можешь понятнее объяснить? - person godot; 13.02.2018
comment
Я не понимаю, куда мне вставить этот код в моем фрагменте :/ - person godot; 13.02.2018
comment
вы должны написать RestTamplate класс. проверьте ответ на справочные ссылки - person Abdul Kawee; 14.02.2018