2010-06-15 4 views
5

L'exception "Cette opération est prise en charge par une URI relative." Se produit dans la situation suivante:exception étrange lors de la connexion à un service WCF via un serveur proxy

J'ai un service WCF:

[ServiceContract(ProtectionLevel=ProtectionLevel.None)] 
public interface IMyService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MyFault))] 
    List<MyDto> MyOperation(int param); 

    // other operations 
} 

public class MyService : IMyService 
{ 
    public List<MyDto> MyOperation(int param) 
    { 
     // Do the business stuff and return a list of MyDto 
    } 

    // other implementations 
} 

MyFault et MyDto sont deux classes très simples marqués avec [DataContract] attribut et chacun ayant seulement trois [DataMember] de type string, int and int?.

Ce service est hébergé dans IIS 7.0 sur un serveur Win 2008 Server avec une application ASP.NET. J'utilise un fichier SVC MyService.svc qui se trouve directement à la racine du site Web. La configuration de service dans web.config est le suivant:

<system.serviceModel> 
    <services> 
    <service name="MyServiceLib.MyService"> 
     <endpoint address="" binding="wsHttpBinding" 
      bindingConfiguration="wsHttpBindingConfig" 
      contract="MyServiceLib.IMyService" /> 
    </service> 
    </services> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpBindingConfig"> 
     <security mode="None"> 
      <transport clientCredentialType="None" /> 
     </security> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="false"/> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Cela semble fonctionner pour autant que je peux entrer l'adresse http://www.domain.com/MyService.svc dans un navigateur et obtenir le « Ceci est un service Windows Communication Foundation » -Bienvenue page.

Un des clients consommant le service est une application console:

MyServiceClient aChannel = new MyServiceClient("WSHttpBinding_IMyService"); 
List<MyDto> aMyDtoList = aChannel.MyOperation(1); 

Il a la configuration suivante:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="true" transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false" 
      proxyAddress="10.20.30.40:8080" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" 
       maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" 
       negotiateServiceCredential="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://www.domain.com/MyService.svc" binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_IMyService" 
      contract="MyService.IMyService" 
      name="WSHttpBinding_IMyService" /> 
    </client> 
</system.serviceModel> 

Quand je lance cette application sur un serveur de production sur un site client appelant aChannel.MyOperation(1) lève l'exception suivante:

Cette opération n'est pas prise en charge pour une adresse URI relative.

Quand je lance cette application client sur mon PC de développement avec la même configuration, à l'exception que je retire proxyAddress="10.20.30.40:8080" des fixations l'opération fonctionne sans problèmes.

Maintenant, je ne sais pas vraiment ce qui spécifie une adresse de serveur proxy pourrait avoir à faire avec URI absolu ou relatif. L'utilisation du serveur proxy ou pas est la seule différence que je peux voir lors de l'exécution du client sur la production ou sur la machine de développement. Est-ce que quelqu'un a une idée de ce que cette exception pourrait signifier dans ce contexte et comment éventuellement résoudre le problème?

Merci d'avance pour l'aide!

Edit:

Dans le cas où il devrait être important: Le service et le client sont construits avec WCF dans .NET Framework 4.

Répondre

8

10.20.30.40:8080 n'est pas une URL valide. Vous voulez http://10.20.30.40:8080.


Voici mon processus de pensée de diagnostic, dans le cas où il aide tout le monde:

  1. Les exceptions ne sont pas habituellement mensonge. Ils signifient généralement exactement ce qu'ils disent. L'astuce consiste à comprendre comment ils pourraient éventuellement dire la vérité.
  2. L'exception dit "Cette opération n'est pas prise en charge pour un URI relatif". Si cela était vrai, cela signifiait qu'une opération était en cours, une URL relative lui était attribuée, mais elle ne supportait pas les URI relatives.
  3. L'OP a alors déclaré que lorsqu'il exécute l'application "à l'exception que je supprime proxyAddress =" 10.20.30.40:8080 "des liaisons".

Il y avait, devant moi, une URI relative. Quand il l'a enlevé, "l'opération" a fonctionné, ainsi j'ai déduit que c'était l'URI relatif qui a été fourni à "l'opération" qui ne les soutient pas.

Vous n'avez pas vraiment besoin d'être Sherlock Holmes pour résoudre celui-ci. La clé était d'être capable de voir instantanément qu'il n'y avait pas scheme:// devant l'URI, le rendant relatif.

+0

Wow! Une question de mille pages, une ligne de réponse et vous avez atteint le sommet. Juste testé, fonctionne, marqué comme réponse. Je me cache dans la honte. Quoi qu'il en soit: Bon que j'ai demandé. Merci beaucoup! (Edit: Lol, "vous pouvez accepter une réponse en 2 minutes", vous étiez trop rapide Attendre maintenant 2 minutes ...) – Slauma

+1

Slauma, c'est très bien que vous avez demandé!)) Parce que j'ai été pris dans une situation très similaire. La raison pour laquelle l'URL de proxy a été utilisée sans "http: //" dans mon cas est qu'il a été copié d'un autre endroit (paramètre à wget.exe) où il s'agissait d'une syntaxe légitime. – Ivan

Questions connexes