Ошибка WCF в мобильном универсальном приложении Windows 10

У вас есть приложение Windows 10 Mobile, которому необходимо совершать вызовы службы WCF. Это существующая служба, работающая на другом сервере (С#/IIS), и я могу нормально подключиться к службе и совершать вызовы из своего приложения Xamarin.Android, используя следующий код:

    public PacTracMobileServerClient GetClient()
    {
        var config = new Config.AppConfig();
        var serverUrl = config.GetODSServerAddress;

        var binding = new CustomBinding();
        //TODO: Make these timeouts configurable
        binding.SendTimeout = TimeSpan.FromMinutes(2);
        binding.ReceiveTimeout = TimeSpan.FromMinutes(2);

        var tme = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);
        binding.Elements.AddRange(tme);

        if (serverUrl.StartsWith("https", StringComparison.CurrentCultureIgnoreCase))
        {
            //HTTPS binding
            var https = new HttpsTransportBindingElement
            {
                MaxReceivedMessageSize = int.MaxValue,
                MaxBufferSize = int.MaxValue,
                RequireClientCertificate = false,
            };
            binding.Elements.Add(https);

            //Trust all certificates
            //ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
        }
        else
        {
            //HTTP binding
            var http = new HttpTransportBindingElement
            {
                MaxReceivedMessageSize = int.MaxValue,
                MaxBufferSize = int.MaxValue
            };
            binding.Elements.Add(http);
        }

        var endPoint = new EndpointAddress(new Uri(serverUrl));

        return new PacTracMobileServerClient(binding, endPoint);
    }

Опять же, вышеизложенное работает в Xamarin.Android (хотя я буду рад улучшить его, если будут предложения). Поскольку моя реализация Xamarin.Android была .Net, я надеялся, что она просто работает с этим приложением Windows UWP. Кажется, все в порядке, за исключением закомментированной строки для доверия всем сертификатам, поскольку кажется, что ServicePointManager не поддерживается в UWP?

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

net_http_client_execution_error

Итак, два вопроса.

  1. Что не так с моим кодом выше и как я могу изменить его для работы с моим приложением UWP, чтобы я мог вызывать службу WCF?

  2. Мне интересно, связана ли моя проблема с сертификатами, поскольку единственная разница между Android (работает) и UWP (не работает) — это строка, которую мне пришлось прокомментировать для ServicePointManager. Как я могу реализовать что-то подобное для UWP? По сути, это приложение используется только для внутренних целей, и я не хочу и не должен беспокоиться о сертификатах при вызове службы.

Примечание. Я включил возможности для Интернета (клиент и сервер), Интернета (клиент) и частных сетей (клиент и сервер) в своем манифесте пакета. Кроме того, я убедился, что подключен к сети и могу получить доступ к сервису из веб-браузера на мобильном устройстве.

Спасибо!


person Michael Bedford    schedule 13.12.2016    source источник
comment
Моя первая мысль заключалась в том, что служба может работать на локальном хосте, который может быть запрещен из приложения UWP, если это так, взгляните на UWP Включить замыкание на себя в локальной сети. Возможно, вы сможете решить № 2, посмотрев на это решение Принятие недействительных сертификатов SSL с помощью WinRT.   -  person ShelbyZ    schedule 13.12.2016
comment
Спасибо за оба варианта, попробую оба. Для получения дополнительной информации я выполняю развертывание на мобильное устройство через USB из своей среды разработки и пробую с мобильного устройства во время работы в режиме отладки, а мобильное устройство подключено к моей сети через Wi-Fi, который имеет доступ к серверу. Я думаю, что это сработает и будет разрешено.   -  person Michael Bedford    schedule 13.12.2016
comment
@ShelbyZ Я вроде пробовал оба. Во-первых, у меня нет проблемы с обратной связью. Во-вторых, я подтвердил, что моя проблема, вероятно, связана с проблемой сертификата. Я прочитал вашу вторую ссылку, которая выглядит так, как мне нужно, чтобы игнорировать проблемы с сертификатом, но она использует httpbaseprotocolfilter, который вы затем передаете httpclient, но, как вы можете видеть из моего фрагмента кода выше, я использую клиент wcf, который был реализован путем добавления службы ссылка, которая не использует httpclient. Как я могу реализовать эти фильтры в своем коде wcf?   -  person Michael Bedford    schedule 14.12.2016
comment
Да, я полагаю, что упустил этот факт, когда первоначально рассматривал проблему. Вы можете попробовать изучить Использование службы SOAP с помощью HttpClient что, я бы сказал, не лучшее решение, но вы могли бы добавить фильтр протокола для проблемы с сертификатом. Единственным другим вариантом может быть просмотр сертификата, используемого службой, чтобы убедиться, что он действительно недействителен (истек срок действия и т. д.), и устранить эту проблему.   -  person ShelbyZ    schedule 15.12.2016