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.
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
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