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