2009-08-13 9 views
0

J'ai quelques stubs C# à un service Web Java (Https) (créé dans Visual Studio 2008, .NET 2.0). Le serveur n'autorise pas le regroupement des demandes. J'ai été en mesure de définir sendChunked sur false dans HttpWebRequest. Lorsque j'appelle les méthodes de service Web qui ont très peu de données traversant le réseau, elles fonctionnent correctement.
Toutefois, lorsque j'envoie des requêtes contenant une quantité importante de données, j'obtiens une erreur "impossible d'analyser la requête".HttpWebRequest au serveur qui ne permet pas le découpage ne fonctionne pas

est ici les deux choses étranges:

  1. Cela fonctionne très bien grâce à Java en réglant le HttpConstants.CHUNKED false, et si vous ne le faites pas, il rompt avec la même « Impossible d'analyser l'erreur de demande » .
  2. Si un violoneur tourne en arrière-plan tout fonctionne bien ?! Je crois que cela est dû à Fiddler tamponner les octets de demande avant de les envoyer. NOTE: si je désactive l'option Fiddler pour "Decrypt HTTPS", elle cesse de fonctionner.
+0

La mise en mémoire tampon de Fiddler peut expliquer pourquoi le problème ne se reproduit pas, mais cela suggère que le problème n'est pas réellement le codage Chunked, car Fiddler ne supprime pas le codage Chunked à moins que vous ne le disiez. – EricLaw

Répondre

0

Ah, le classique "changer le comportement en l'observant". Le problème est que, comme vous le faites remarquer, Fiddler fait un tas de tampons et similaires. Une option peut désactiver HTTPS (temporairement) et utiliser un outil de reniflage de réseau passif comme Wireshark pour voir si .NET obéit aux paramètres que vous définissez.

+0

Existe-t-il un moyen d'imiter ce que fait Fiddler dans mon propre code? –

+0

Très bien, j'ai la demande dans Wireshark, que je n'ai jamais utilisée auparavant, avez-vous une idée de ce que je devrais rechercher? Puis-je dire d'une manière ou d'une autre si elle est morcelée ou non? –

+0

L'info dans Wireshark est similaire à ce que vous voyez dans Fiddler, mais pas tout à fait décodée. Cliquez avec le bouton droit sur l'un des paquets de votre requête et choisissez "Suivre le flux". Vous obtiendrez une fenêtre contextuelle avec les données qui vont et viennent - j'espère que vous verrez les en-têtes HTTP là-dedans et aurez une meilleure idée de ce qui se passe. Remarque: Wireshark ne peut pas * voir * via HTTPS, vous devrez donc utiliser le protocole HTTP standard pour l'utiliser. Si cela ne casse pas le HTTP, cela ne vous aidera pas beaucoup. –

0

Je ne comprends pas clairement ce que vous entendez par "stubs". Voulez-vous dire que vous avez créé une référence Web au service Java?

Si oui, vous pouvez remplacer la méthode GetWebRequest pour retourner votre propre HttpWebRequest avec la SendChunked propriété définie sur false:

public partial class Service1 
{ 
    protected override WebRequest GetWebRequest(Uri uri) 
    { 
     HttpWebRequest request = (HttpWebRequest) base.GetWebRequest(uri); 
     request.SendChunked = false; 
     return request; 
    } 
} 

Si c'est pas ce que vous demandez, alors s'il vous plaît préciser.

+0

Oui, les stubs sont la référence Web du service Java. Votre code ci-dessus correspond exactement à ce que j'ai actuellement.Cependant, il semble que la requête complète ne parvienne pas au serveur pour une raison quelconque - mais le fait quand Fiddler est en cours d'exécution. –

+0

Vous devrez peut-être utiliser Microsoft Network Monitor ou quelque chose de moins intrusif. Voir http://www.microsoft.com/downloads/details.aspx?FamilyID=983b941d-06cb-4658-b7f6-3088333d062f&displaylang=fr. –

+0

En particulier, cela ne ressemble pas à un problème de segmentation. Cela peut être un hareng rouge. –

0

J'ai résolu ce problème. On dirait que lorsque je crée les stubs pour les méthodes de service Web en utilisant "ajouter une référence Web" dans Visual Studio, il ajoute quelque chose à la demande Web qui rendait le serveur mécontent. J'ai écrit ma propre méthode qui crée le XML à partir de zéro et envoie la requête Web sans utiliser aucun des talons et cela fonctionne très bien. Je déteste des problèmes comme celui-ci.

+1

Si vous prenez votre code modifié, capturez la demande via Fiddler, et prenez votre demande originale capturée par Fiddler, vous pouvez Windiff les deux pour voir exactement comment ils diffèrent. – EricLaw