WCF на Xamarin Forms / Android;Таймауты после более чем 2 или 3 запросов - PullRequest
0 голосов
/ 30 сентября 2019

В настоящее время я испытываю некоторые трудности с использованием форм Xamarin, в частности, с созданным им проектом Android (проект UWP работает нормально).

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

{System.TimeoutException: The operation has timed out.
  at System.ServiceModel.Channels.HttpRequestChannel+HttpChannelRequestAsyncResult.WaitEnd () [0x0001b] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.Channels.HttpRequestChannel.EndRequest (System.IAsyncResult result) [0x0000e] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.Channels.HttpRequestChannel.Request (System.ServiceModel.Channels.Message message, System.TimeSpan timeout) [0x0000b] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.MonoInternal.ClientRuntimeChannel.Request (System.ServiceModel.Channels.Message msg, System.TimeSpan timeout) [0x0000e] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.MonoInternal.ClientRuntimeChannel.Request (System.ServiceModel.Description.OperationDescription od, System.Boolean isAsync, System.Object[]& parameters, System.ServiceModel.OperationContext context) [0x00071] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.MonoInternal.ClientRuntimeChannel.DoProcess (System.Reflection.MethodBase method, System.String operationName, System.Boolean isAsync, System.Object[]& parameters, System.ServiceModel.OperationContext context) [0x00031] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.MonoInternal.ClientRuntimeChannel.Process (System.Reflection.MethodBase method, System.String operationName, System.Boolean isAsync, System.Object[]& parameters, System.ServiceModel.OperationContext context) [0x0001e] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.MonoInternal.ClientRuntimeChannel.Process (System.Reflection.MethodBase method, System.String operationName, System.Object[] parameters, System.ServiceModel.OperationContext context) [0x00002] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.ClientRealProxy.DoInvoke (System.Runtime.Remoting.Messaging.IMessage inputMessage) [0x000d5] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.ServiceModel.ClientRealProxy.Invoke (System.Runtime.Remoting.Messaging.IMessage inputMessage) [0x00000] in <6fd1a53b91504e5ead8b8cbaa9ed1e83>:0 
  at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (System.Runtime.Remoting.Proxies.RealProxy rp, System.Runtime.Remoting.Messaging.IMessage msg, System.Exception& exc, System.Object[]& out_args) [0x000d6] in <ff07eae8184a40a08e79049bbcb31a0e>:0 }

Программа использует WCF для связи с сайтом, на котором работает IIS, на который ссылаются в формах Xamarin черезметка подключенных сервисов на панели решений.

В фиктивном консольном приложении я могу без проблем запустить следующий код (определенные объекты отредактированы), где cl - это экземпляр Service Client .:

Это просто тестирование кода для диагностики проблемы, фактическая проблема приводит к тайм-аутам из приложения WCF Service / Android.

   for (int i = 0; i < 50; i++)
      {

        DateTime dts = DateTime.Now;
        StaticControl.cl.EstablishToken("usr", "password");
        DateTime dte = DateTime.Now;
        var elap = (dte - dts).TotalSeconds;
        System.Diagnostics.Debug.WriteLine($"TotalElapse for {i.ToString("000")} = {elap}s");

      }

Это занимает в среднем 0,01-0,1 секунды. на консоли .Net. То же самое можно сказать и о приложении UWP.

Однако, когда этот код используется в XamarinForms / Android, у меня возникают тайм-ауты.

[0:] CLSTATEProp: Created
[0:] TotalElapse for 000 = 0.133563s
[0:] CLSTATEProp: Opened
Thread started: <Thread Pool> #9
Thread started: <Thread Pool> #10
Thread started: <Thread Pool> #11
[0:] TotalElapse for 001 = 0.136818s
[0:] CLSTATEProp: Opened
[0:] TotalElapse for 002 = 0.040992s
[0:] CLSTATEProp: Opened
[0:] TotalElapse for 003 = 0.060191s
[0:] CLSTATEProp: Opened
Thread finished: <Thread Pool> #3
The thread 0x3 has exited with code 0 (0x0).

Это базовая структура моего статического класса, который содержит объект MySvc:

public static class StaticControl
{
    private static MySvc.ServiceClient _cl;

    public static MySvc.ServiceClient cl
    {
      get
      {
        if (_cl == null || _cl.InnerChannel.State == System.ServiceModel.CommunicationState.Closed)
        {
          _cl = new ServiceClient ();
          // This below just masks the problem, though it does seem to make it more tolerant 
          //_cl.InnerChannel.OperationTimeout = new TimeSpan(0, 50, 0);
        }

        Debug.WriteLine("CLSTATEProp: " + _cl.State.ToString());
        return _cl;
      }
    }
}

в файле App.xaml.cs , который я добавилследующее к методу OnStart ()

    protected override void OnStart()
    {
      System.Net.ServicePointManager.DefaultConnectionLimit = 200;
       //....
    }

В службе, вызываемой на сайте (размещенной на IIS) (в VB.net) Атрибуты задаются следующим образом:

<ServiceContract()>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, InstanceContextMode:=InstanceContextMode.PerCall)>

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

  • Потоковая обработка запросов в консольном приложении, чтобы оно могло одновременно вызывать службу [Выполнено и обработано]
  • Попытка решить ту же проблему с HTTPWebRequests [Также выполнено и обработано]
  • Изменение TransportMode на Stream [Без разницы]
  • Закрытие innerChannel и создание нового объекта [Без разницы]
  • Увеличение рабочего времени ожидания [скрывает проблему]

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

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