2012-11-29 5 views
4

Nous avons une application Web hébergée sur un environnement d'hébergement tiers. L'application serveur expose certains services WCF RESTFUL à nos applications iPad..NET 4.5 et Compression de requête WCF

Les services WCF sont .svc-less et sont enregistrés dans le fichier Glonbal.asax. Exemple:

RouteTable.Routes.Add("service name", new ServiceRoute("url", 
    new WebServiceHostFactory(), routingServiceContract)); 

Depuis que nous avons besoin de transférer des données massives de nos applications iPad à l'application serveur, certaines des demandes sont compressées par gzip avant d'être envoyé au service WCF. Et depuis l'application serveur a été initialement construit sur la base .NET 3.5 un morceau de code comme celui-ci a été en charge décomprimer les requsts comprimé:

public void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrEmpty(Request.Headers["Content-Encoding"])) 
    {     
    if (Request.Headers["Content-Encoding"].ToLower().Contains("gzip")) 
    Request.Filter = new GZipStream(Request.Filter, CompressionMode.Decompress); 

    if (Request.Headers["Content-Encoding"].ToLower().Contains("deflate")) 
     Request.Filter = new DeflateStream(Request.Filter, CompressionMode.Decompress); 
    } 
} 

Ce travaillait jusqu'à ce que notre fournisseur d'hébergement installé 4.5 .NET sur leur serveur . Ensuite, les requêtes JSON compressées ont commencé à échouer (nous obtenons des erreurs http 400 ou parfois 500). Après tant d'enquête, il s'est avéré que le code et le fichier web.config sont tous OK parce que le service WCF fonctionne parfaitement sur un serveur qui n'a pas .NET 4.5 installé.

J'ai même commenté le code ci-dessus et publié sur le même serveur, mais cela n'a pas fonctionné à nouveau. J'avais pensé que la demande était décodée deux fois!

Maintenant, je me demande comment puis-je tirer parti de la fonction de compression intégrée WCF 4.5 et faire fonctionner ce site Web? Je préfère me débarrasser du code C# personnalisé et utiliser la fonction de compression WCF 4.5.

p.s. le service Web s'exécute en mode de compatibilité ASP.NET.

p.p.s. le service Web fonctionne parfaitement si nous ne compressons pas la requête http.

+0

Quelques questions: (1) S'agit-il d'une application 3.5 ou 4.0? Une application 3.5 peut ne pas être affectée par l'installation de 4.5 car 4.5 est une mise à jour à 4.0. (2) Voyez-vous que les appels aboutissent si vous commentez votre code de compression et envoyez des requêtes non compressées? (3) Pourriez-vous poster votre web.config et un peu de repro pour nous? Je suis intéressé à voir comment les paramètres de liaison ressemble. – Praburaj

+0

1- Il s'agit d'une application .NET 4.0 et ASP.NET MVC 3.0. 2- Non, si nous commenter le code de compression ça ne va pas aider. Si nous conservons le code de compression et construisons le site, copiez le même site web pré-compilé sur un serveur qui a .NET 4.0 (pas 4.5) cela fonctionne. 3- Je vais essayer d'afficher le fichier web.config ici. J'ai besoin de demander la permission au grand patron :) – Aref

+0

@Praburaj - Pour clarifier, envoyer des requêtes _uncompressed_ avec le code de compression désactivé (ou activé d'ailleurs) fonctionne comme prévu. –

Répondre

0

J'ai parcouru votre fichier de configuration & Application_BeginRequest. J'ai répliqué votre fichier de configuration sur ma machine avec. Net 4.0 et vérifié que cela a bien fonctionné. Je pourrais également voir que les mêmes paramètres échouent sur une machine avec .net 4.5. Basé sur mon observation votre problème n'est pas lié au code de compression/décompression que vous avez dans Application_BeginRequest. Mais vous rencontrez le même problème que celui que j'ai décrit dans ce [post] [1]

[1]: WCF - Conflicting endpoints after .Net 4.5 installation "Post". Dans ce post, j'ai également posté le travail autour de ce problème. Le contourner consiste à définir explicitement le point de terminaison REST. En suivant le même travail, je pouvais voir que votre projet commençait à fonctionner. Précisément tout ce que je devais faire pour que votre projet fonctionne est d'ajouter ces deux lignes dans la configuration et de configurer explicitement le point de terminaison du service.

<services> 
     <service name="<YourNamespace>.TestService"> 
     <endpoint address="" binding="webHttpBinding" contract="<YourNamespace>.TestService" behaviorConfiguration="RESTEndpointBehavior"/> 
     </service> 
    </services> 

Pouvez-vous vérifier si cela résout votre problème?

+0

Il était ma (récente) compréhension que le Les éléments '' et' 'ont été ignorés lorsque vous utilisez' ServiceRoute'. N'est-ce pas le cas? –

+0

Je suppose que cela fonctionne. Faites-moi savoir si cela a fonctionné pour vous. – Praburaj

+0

L'ajout de points de terminaison de service explicites entraîne la méthode de service ("[endpointadddress]/method") à 404. Cependant, la suppression de * system.serviceModel config * excepté serviceHostingEnvironment entraîne toujours le fonctionnement de la requête non compressée (sans doute en raison du ServiceRoute). Cependant, les demandes compressées échouent toujours avec un 400, même si le code BeginRequest est exécuté pour cette requête. –