2017-03-06 2 views
0

Nous avons récemment désactivé codebase pour définir par programmation les liaisons WCF et générer des proxies. Nous nous sommes éloignés de la définition de la configuration dans ServiceReferences.clientconfig. Depuis lors, certains longs appels WCF ont expiré dans Silverlight et je ne sais pas pourquoi. J'ai mis tous les délais d'attente dans les fixations à 24 heures. J'ai besoin de quelques suggestions sur la façon de diagnostiquer le problème. Au début, je pensais que le problème était un délai d'attente du côté client car l'erreur se produisait après quelques minutes, mais le code du côté serveur continuait et finissait par aboutir. Mais je ne suis pas complètement sûr de cela maintenant. Je regardais la fenêtre du journal de Kestrel, et j'ai remarqué qu'elle disait que la requête se terminait en même temps que l'erreur apparaissait dans Silverlight, même si l'opération se poursuivait côté serveur. Mais, je ne trouve aucune information sur la définition du OperationTimeout côté serveur. Voici la liaison côté serveur:Silverlight WCF Timeout

private static CustomBinding CreateCustomBinding() 
{ 
    var httpTransportBindingElement = new HttpTransportBindingElement 
    { 
     MaxBufferPoolSize = 2147483647, 
     MaxBufferSize = 2147483647, 
     MaxReceivedMessageSize = 2147483647 
    }; 

    var bindingElements = new BindingElementCollection(); 
    var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement 
    { 
     MaxReadPoolSize = 2147483647, 
     MaxSessionSize = 2147483647, 
     MaxWritePoolSize = 2147483647, 
     ReaderQuotas = new XmlDictionaryReaderQuotas 
     { 
      MaxDepth = 2147483647, 
      MaxStringContentLength = 2147483647, 
      MaxArrayLength = 2147483647, 
      MaxBytesPerRead = 2147483647, 
      MaxNameTableCharCount = 2147483647 
     } 
    }; 

    bindingElements.Add(binaryMessageEncodingBindingElement); 
    bindingElements.Add(httpTransportBindingElement); 

    var binding = new CustomBinding(bindingElements) 
    { 
     Name = "UserNameBinding", 
     CloseTimeout = new TimeSpan(24, 0, 0), 
     OpenTimeout = new TimeSpan(24, 0, 0), 
     ReceiveTimeout = new TimeSpan(24, 0, 0), 
     SendTimeout = new TimeSpan(24, 0, 0) 
    }; 
    return binding; 
} 

Voici le code de création de la liaison côté client. Faites-moi savoir s'il y a un autre code pertinent ici qui me manque. J'ai débogué ce code pour m'assurer que le proxy obtient cet ensemble de liaison.

public static Binding GetWCFBinding(bool isHttps) 
    { 
     var binding = new CustomBinding 
     { 
      CloseTimeout = new TimeSpan(24, 00, 00), 
      OpenTimeout = new TimeSpan(24, 00, 00), 
      ReceiveTimeout = new TimeSpan(24, 00, 00), 
      SendTimeout = new TimeSpan(24, 00, 00)     
     }; 

     var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement(); 

     binding.Elements.Add(binaryMessageEncodingBindingElement); 

     binding.Elements.Add(isHttps 
      ? new HttpsTransportBindingElement() 
      { 
       MaxBufferSize = int.MaxValue, 
       MaxReceivedMessageSize = int.MaxValue, 
       TransferMode = TransferMode.Buffered 
      } 
      : new HttpTransportBindingElement() 
      { 
       MaxBufferSize = int.MaxValue, 
       MaxReceivedMessageSize = int.MaxValue, 
       TransferMode = TransferMode.Buffered 
      }); 

     return binding; 
    } 

J'ai aussi mis cette ligne dans le constructeur du proxy:

InnerChannel.OperationTimeout = new TimeSpan (24, 0, 0);

L'erreur est cette erreur non-descript qui retourne toujours quand quelque chose va mal sur le serveur ou le client arrive à expiration:

Module: Adapt.Presentation.Xivic.CodeGeneration Exception Message: The remote server returned an error: NotFound. Time: 6/03/2017 4:17:55 PM Stack Trace: ThrowForNonSuccess at offset 90 in file:line:column :0:0 HandleNonSuccess at offset 87 in file:line:column :0:0 GetResult at offset 30 in file:line:column :0:0 MoveNext at offset 525 in file:line:column :0:0 Full Exception: System.ServiceModel.CommunicationException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClassa.b__9(Object sendState) at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.b__0(Object sendState) --- End of inner exception stack trace --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result) --- End of inner exception stack trace --- at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Adapt.Presentation.Xivic.CodeGeneration.d__15.MoveNext()

Répondre

0

Puisque vous êtes sur Silverlight, les chances sont que c'est une DomainService erreur introuvable . C'est un problème raisonnablement commun et indique une mauvaise configuration sur le serveur. Vous devriez être capable d'allumer Fiddler et regarder quelle URL échoue, et le comparer à votre version précédente sur le côté serveur.

En regardant rapidement vos liaisons, je ne vois pas de point de terminaison défini pour votre service.