2010-06-15 13 views
5

L'eccezione "Questa operazione non è supportata per un parente URI." Si verifica nella seguente situazione:Strano eccezione durante la connessione a un servizio WCF tramite un server proxy

Ho un servizio 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 e MyDto sono due classi molto semplici contrassegnati con l'attributo [DataContract] e ciascuno avendo solo tre [DataMember] di tipo string, int and int?.

Questo servizio è ospitato in IIS 7.0 su un server Win 2008 insieme a un'applicazione ASP.NET. Sto usando un file SVC MyService.svc che si trova direttamente nella radice del sito web. La configurazione del servizio nel web.config è la seguente:

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

Questo sembra funzionare in modo quanto posso inserire l'indirizzo http://www.domain.com/MyService.svc in un browser e ottenere il "Si tratta di una Communication Foundation servizio Windows" -Welcome pagina.

Uno dei clienti che consumano il servizio è un'applicazione console:

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

E 'la seguente configurazione:

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

Quando eseguo l'applicazione in un server di produzione presso un cliente chiama aChannel.MyOperation(1) getta la seguente eccezione:

Questa operazione non è supportata per un URI relativo.

quando faccio funzionare questa applicazione client sul mio PC di sviluppo con esattamente la stessa configurazione, con l'eccezione che rimuovo proxyAddress="10.20.30.40:8080" dagli attacchi l'operazione funziona senza problemi.

Ora davvero non so cosa specificare un indirizzo del server proxy potrebbe avere a che fare con URI assoluti o relativi. L'uso del server proxy o meno è l'unica differenza che posso vedere quando si esegue il client sulla produzione o sul computer di sviluppo.

Qualcuno ha un'idea di cosa possa significare questa eccezione in questo contesto e come è possibile risolvere il problema?

Grazie in anticipo per l'aiuto!

Edit:

In caso dovrebbe essere importante: Servizio e client sono costruiti con WCF in .NET Framework 4.

risposta

8

10.20.30.40:8080 non è un URL valido. Si desidera http://10.20.30.40:8080.


Ecco il mio processo di pensiero diagnostico, in caso aiuta chiunque:

  1. eccezioni di solito non mentono. Di solito significano solo esattamente quello che dicono. Il trucco è capire come potrebbero mai dire la verità.
  2. L'eccezione diceva "Questa operazione non è supportata per un URI relativo". Se ciò fosse vero, significava che si stava eseguendo un'operazione, che gli veniva dato un URL relativo, ma non supporta URI relativi.
  3. L'OP ha poi detto che quando esegue l'applicazione "con l'eccezione che rimuovo proxyAddress =" 10.20.30.40:8080 "dai binding".

Lì, di fronte a me, c'era un URI relativo. Quando l'ha rimosso, l'operazione ha funzionato, quindi ho dedotto che questo era l'URI relativo fornito alla "operazione" che non li supporta.

Non devi proprio essere Sherlock Holmes per risolvere questo. La chiave è stata la possibilità di vedere immediatamente che non c'era scheme:// davanti all'URI, rendendolo relativo.

+0

Wow! Una domanda lunga mille pagine, una sola riga di risposta e hai colpito l'unghia. Appena testato, funziona, contrassegnato come risposta. Mi nascondo per la vergogna. Ad ogni modo: bene che ho chiesto. Grazie mille! (Modifica: Lol, "puoi accettare una risposta in 2 minuti", eri troppo veloce. Aspettando ora 2 minuti ...) – Slauma

+1

Slauma, è molto bello che tu l'abbia chiesto!)) Perché mi sono trovato in una situazione molto simile. Il motivo per cui l'URL proxy è stato utilizzato senza "http: //" nel mio caso è che è stato copiato da un altro posto (parametro su wget.exe) in cui si trattava di una sintassi legittima. – Ivan

Problemi correlati