Domanda

Ho un'applicazione web schierato in un provider di hosting internet. Questa applicazione web consuma un servizio WCF distribuito a un server IIS si trova sul server di applicazioni della mia azienda, al fine di avere accesso ai dati nel database della società, i ragazzi di rete mi ha permesso di esporre questo servizio WCF tramite un firewall per motivi di sicurezza. Un diagramma sarebbe simile a questa.

  

[pagina Hosted] ---> (Internet) ---> | Firewall <Public IP>:<Port-X > |   ---> [IIS con WCF Servizio <Comp. Network Ip>:<Port-Y>]

Inoltre ho voluto usare wsHttpBinding per sfruttare le sue caratteristiche di sicurezza, e cifrare informazioni sensibili.

Dopo aver provato fuori ottengo il seguente errore:

  

Dettagli eccezione: System.ServiceModel.EndpointNotFoundException: The   messaggio con A 'http: //: /service/WCFService.svc' non può essere   elaborate al ricevitore, a causa di una mancata corrispondenza AddressFilter al   EndpointDispatcher. Verificare che il mittente e il destinatario di   EndpointAddresses d'accordo.

Facendo qualche ricerca ho scoperto che wsHttpBinding utilizza standard WS-Addressing, e leggere su questo standard ho imparato che l'header SOAP è stata migliorata per includere tag come 'MessageID', 'ReplyTo', 'Azione' e 'A'.

Quindi immagino che, in quanto l'endpoint applicazione client specifica l'indirizzo IP Firewall e Port, e il servizio risponde con il suo indirizzo di rete interna che è diverso da IP del firewall, quindi WS-Addressing incendi il messaggio di cui sopra. Quale Penso che sia una misura molto buona sicurezza, ma non è molto utile nel mio scenario.

Citando WS-Addressing presentazione standard ( http://www.w3.org/ Presentazione / WS-indirizzamento / )

  

"A causa della gamma di tecnologie di rete attualmente in uso diffuso   (Ad esempio, NAT, DHCP, firewall), molte implementazioni non può assegnare un   URI globale significativo per un determinato punto finale. Per consentire questi ‘anonimi’   endpoint di avviare modelli di scambio di messaggi e ricevere risposte,   definisce WS-Addressing la Seguendo la nota URI per l'uso da   endpoint che non possono avere una stalla, risolvibile Uri.    http://schemas.xmlsoap.org/ws/2004/08/ rivolgendosi / ruolo / anonimo "

Come faccio a configurare il mio wsHttpBinding Endpoint per affrontare il mio IP del Firewall e di ignorare o aggirare l'indirizzo specificato nel tag ‘a’ WS-Addressing nell'intestazione del messaggio SOAP? O devo cambiare qualcosa nella mia configurazione endpoint del servizio?

Guida e la guida sarà molto apprezzato.

Marko.

P.S .: Mentre trovo alcuna soluzione a questo, sto usando basicHttpBinding senza alcun problema, naturalmente.

È stato utile?

Soluzione

Si potrebbe provare a decorare la vostra classe di servizio con:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Altri suggerimenti

Un modo più sicuro per gestire questa situazione è quello di impostare il punto finale ListenUri al servizio Url, e l'endpoint Indirizzo al punto finale esterno dove i clienti inviano messaggi. In questo modo il servizio "trust" messaggi indirizzati solo a quell'indirizzo, non solo qualsiasi indirizzo.

Non so circa la soluzione da Mitch Baker, mai provato. Ma si tratta di modificare il codice generato. C'è un altro modo per aggirare questo.

Suppongo che si è generato il codice client utilizzando svcutil.exe, dando un indirizzo MEX che punta al firewall. Quando si esegue questa operazione, tutta la configurazione necessaria viene aggiunto al App.config (o Web.config). Tuttavia, l'indirizzo del servizio nella configurazione punterà all'indirizzo del servizio reale (come nel WSDL file indirizzo del davanzale servizio di essere l'indirizzo reale del servizio).

Quindi, quello che penso possa risolvere questo problema:

  1. Genera codice client, dando l'indirizzo MEX (ad esempio: http: //: Port-X / servizio / wcfservice.svc WSDL?). Questa volontà ha generato tutta la configurazione necessaria.

  2. Quando si invoca il costruttore cliente, dare l'URI del firewall come l'EnpointAddress, e il nome della configurazione della configurazione generato. In questo modo, il client invia un messaggio come se fosse stato l'invio al servizio, ma all'indirizzo del firewall:

    client = new serviceclient (endpointConfigName, nuova System.ServiceModel.EndpointAddress ( "http: //: Port-X / servizio / wcfservice.svc"));

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top