В настоящее время я испытываю некоторые трудности с использованием форм 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 и создание нового объекта [Без разницы]
- Увеличение рабочего времени ожидания [скрывает проблему]
увыпока ничего конкретногоЕще проблема, любая помощь приветствуется.