2009-11-25 9 views
40

Ho un servizio WCF ospitato per cui ho creato un factory personalizzato, in modo che funzioni con più intestazioni host:Errore WCF: l'indirizzamento manuale è abilitato su questa fabbrica, quindi tutti i messaggi inviati devono essere preindirizzati

/// <summary> 
/// Required for hosting where multiple host headers are present 
/// </summary> 
public class MultipleHostServiceFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     List<Uri> addresses = new List<Uri>(); 
     addresses.Add(baseAddresses[0]); 
     return base.CreateServiceHost(serviceType, addresses.ToArray()); 
    } 
} 

Sono quasi sicuro che i miei file di configurazione ora sono corretti, sia su client che su server (can be seen here).

L'errore che sto ottenendo sembra essere correlato alla fabbrica: indirizzamento

manuale è abilitato su questa fabbrica, in modo che tutti i messaggi inviati devono essere pre-affrontati.

public string GetData(int value) { 
    return base.Channel.GetData(value); 
} 

l'errore si verifica in linea return base.Channel.GetData(value);.

risposta

57

ho sperimentato questo errore e il problema è stato risolto con l'aggiunta della WebHttpBehavior (linea 2 in basso):

var factory = new ChannelFactory<IService>(new WebHttpBinding(), uri); 
factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
var proxy = factory.CreateChannel(); 
+3

Le risposte di cui sopra non hanno aiutato affatto. Grazie, – Matthias

+1

Se l'endpoint ha specificato , è necessario utilizzare invece WebScriptEnablingBehavior, altrimenti si otterrà sempre lo stato "Faulted." –

+1

Questo ha funzionato per me, ma ho anche dovuto aggiungere un riferimento usando WebHttpBehavior -> 'using System.ServiceModel.Description;' –

1

Non penso che questo abbia necessariamente a che fare con la vostra fabbrica.

Vedi

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.transportbindingelement.manualaddressing.aspx

o altri tra i primi Bing risultati per "manualaddressing". Sembra che l'associazione utilizzata sia incompatibile con qualche altra parte della logica di stack/messaggistica.

+0

Bene, non sto usando il biding personalizzato - usando web webHttpBinding - definito in entrambi. Inizialmente, il problema era che il client aveva solo un binding personalizzato definito (ho semplicemente creato un riferimento al servizio sul mio server WCF e lasciato che VS faccia il resto). Ancora esaminando questo nuovo errore ... – ElHaix

+0

"aggiungi riferimento servizio" e "webHttpBinding" non funzionano bene insieme e spiegherebbero l'errore. Penso che il tuo cliente stia cercando di parlare SOAP usando un binding WS-Addressing al tuo servizio REST-y che parla solo HTTP. – Brian

+0

Vedere per es. http: // damianm.com/tech/building-a-rest-client-with-wcf/ – Brian

2

Quindi questo è finalmente giunto alla fine!

Brian - grazie per la vostra guida su questo. Gli attacchi sono stati mis-allineati b/t client e server, e alla fine ho finito per andare con il seguente sia:

<basicHttpBinding> 
    <binding name="TransportSecurity"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 

... e impostando la loro endpoint vincolanti e bindingConfiguration attributi di conseguenza:

<endpoint binding="basicHttpBinding" 
      bindingConfiguration="TransportSecurity" 
      contract="ServiceReference1.IService" 
      name="WebHttpBinding_IService" 
      address="https://mysslserver.com/Service.svc" /> 

Poiché questo è un campo relativamente nuovo per me, solo la spiegazione del motivo per cui quegli errori stavano spuntando mi portano nella giusta direzione :).

25

ho aggiunto un riferimento al servizio come al solito e ottenuto questo errore. Risulta tutto quello che dovevo fare era di modificare la configurazione client per l'utilizzo di una configurazione endpoint con un comportamento specificando webhttp

<client> 
    <endpoint address="http://localhost:9000/GeoConverterService/GeoConverterService.svc" 
      binding="webHttpBinding" 
      contract="GeoConverter.IGeoConverterService" 
      behaviorConfiguration="webhttp"/> 
</client> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webhttp"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

+2

Hm ... non appena aggiungo che poi ottengo '(405) Metodo non consentito'. –

0

Sì la risposta da Jason Mardell ha lavorato anche per me, La mia rilegatura non indicava un comportamento. quindi nel bind ho aggiunto: behaviorConfiguration="webhttp"

Problemi correlati