Domanda

Ho bisogno di creare un servizio WCF che è ospitato in IIS, utilizza http trasporto e stato di attesa nella memoria del server. Mentre io sono consapevole del fatto che i servizi con stato non sono una buona idea, questo ultimo vincolo è necessario per far funzionare il servizio con un client precedente.

Il mio primo pensiero è stato quello di seduta di asp.net per memorizzare i valori. Ho attivato la modalità di compatibilità asp.net nel mio servizio, che mi ha dato l'accesso alle HttpContext, ma i valori che sono stati collocati nell'oggetto sessione non venivano persistito nella memoria. Suppongo che questo era perché il http modulo che lo stato maniglie sessione non è stato configurato correttamente, ma quando googling per risposta mi sono imbattuto, le sessioni di WCF e ho pensato che potrebbe essere una migliore idea di usarli.

Tuttavia, le sessioni di WCF sembrano quanto sotto-documento e il luogo di una strana serie di prerequises su un servizio, e non sono stato in grado di trovare una configurazione che si adatta alle mie esigenze: devono essere ospitati in IIS, devono utilizzare http o https trasportare e non può rispondere su autenticazione di Windows perché il client e il server non faranno parte dello stesso dominio. Sto cercando di ottenere questo andare con il wsHttpBinding, avevo sentito le sessioni di WCF richieste sia di sicurezza o un messaggio affidabili, ma: - Utilizzando il legame di serie e quando i server non fanno parte dello stesso dominio viene a mancare con un “SecurityNegotiationException Il chiamante non è stato autenticato dal servizio” eccezione. Questo è abbastanza logico che stava usando la sicurezza di Windows.

  • Se io di disabilitazione sicurezza a completare fallisce con un “contratto richiede di sessione, ma Binding 'WSHttpBinding' non supporta o non è configurato correttamente per sostenerlo”.

  • Se pur mantenendo la sicurezza disabilitato abilito messaggio affidabile ottengo l'eccezione “Binding convalida non è riuscita perché il WSHttpBinding non supporta sessioni affidabili oltre sicurezza dei trasporti (HTTPS). La fabbrica di canale o host del servizio non può essere aperto. Usare la protezione dei messaggi per la messaggistica sicura e affidabile su HTTP “.

  • Ho provato consentendo sicurezza a livello di trasporto, ma questo non sembra fare alcuna differenza per l'errore generato

C'è qualche configurazione che lavoro potrebbe per me? O devo solo tornare al piano di utilizzo di sessioni di asp.net?

È stato utile?

Soluzione

Si possono avere informazioni di sessione WCF tenere in memoria in modo semplice abbastanza. Per eliminare eventuali influenze esterne nelle mie istruzioni, darò per scontato si sta iniziando con un nuovo progetto:

  1. Crea un nuovo progetto di servizio WCF biblioteca. Questo progetto già contenere un servizio con un WSHttpBiding legame preconfigurato.
  2. Vai al contratto di servizio (IService1.cs) e modificare l'attributo ServiceContract al seguente:

    [ServiceContract(SessionMode = SessionMode.Required)]
    
  3. Vai al implimentation di servizio (Service1.cs) e aggiungere il seguente attributo ServiceBehavior alla classe di servizio (Service1):

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
    
  4. Aggiungi dati della sessione in quanto membri della classe di servizio (Service1):

    public class Service1 : IService1
    {
        ...
    
        private string UserFullName { get; set; }
    
        ...
    }
    
  5. Usa i membri ai dati specifici presenti sessione (ricordarsi di aggiungerli anche al contratto di servizio, IService1):

    public class Service1 : IService1
    {
        ...
    
        public string Welcome(string fullName)
        {
            UserFullName = fullName ?? "Guest";
            return string.Format("Welcome back, {0}!", UserFullName);
        }
    
        public string Goodbye()
        {
            return string.Format("Come back soon, {0}!", UserFullName ?? "Guest");
        }
    
        ...
    }
    

SessionMode.Required assicura che i vostri clienti dalla sessione rintracciato.
InstanceContextMode.PerSession assicura che un'istanza della classe di servizio (Service1) viene creato per ogni sessione, in modo che è possibile mantenere i dati della sessione in essa ed esisterà in memoria su più chiamate nella stessa sessione.
ConcurrencyMode.Single assicura che solo un thread può entrare ogni istanza classe di servizio (Service1), e previene possibili problemi di concorrenza se voi solo i dati di accesso dalla classe di servizio (e le posizioni thread-safe esterni).

Modifica Per impostazione predefinita, WSHttpBinding consente solo le sessioni di sicurezza. Ma è anche il supporto sessioni affidabili, che permettono sessioni che istituiscono senza protezione attivata. La disabilita configurazione seguente vincolante sicurezza e consente sessioni affidabile:

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

Altri suggerimenti

IMO questo è ciò che accade quando si utilizza una tecnologia con un povero astrazione su HTTP come WCF. Il fatto che i servizi Web WCF in teoria potrebbero essere ospitati senza HTTP (cioè più di NET TCP, MSMQ, ecc) rende solo più difficile da usare funzionalità integrate di HTTP senza entrare in un inferno di configurazione e avviare un gioco di "indovinare la configurazione corretta per tentativi ed errori" in cui si tenta ogni possibile permutazione configurazione fino a quando hai trovato quello corretto che funziona!

In definitiva se non si poteva usare WCF e ha dovuto implementare il servizio Web da zero si dovrebbe semplicemente impostare un cookie quando il client autenticato. Poi, con ogni richiesta del cliente basta afferrare le informazioni di sessione a cui fa riferimento quel cookie.

Una soluzione possibile se si dovesse usare WCF è quello di prendere la gestione delle sessioni nelle vostre mani (E 'quello che faccio quando sono infelice con lo sforzo necessario per ottenere qualcosa per il lavoro) e hanno una proprietà esplicito 'Session' su tutti i vostri servizi web che richiedono una sessione / autenticazione (di solito un GUID generato autenticazione). Così, per ogni richiesta successiva si utilizza il GUID per reidratare le informazioni sulla sessione associato a quel cliente.

Se siete interessati a provare diversi quadri di servizi web mantengo un Open Source Web Services Framework che permette si costruisce senza configurazione, SECCO, servizi web testabili in cui (senza alcuna configurazione richiesto) ogni servizio web che si crea è automaticamente accessibile su REST XML, JSON, JSV, SOAP 1.1, SOAP 1.2 punti finali. Effettivamente vi permette di accedere al vostro stesso servizio web tramite un HTTP GET URL per i client REST-ful e facile il debugging, così come endpoint SOAP (una scelta popolare ancora mandato da alcune imprese). Il Ciao Mondo esercitazione dovrebbe darvi una panoramica buona su alcune delle sue caratteristiche e come funziona.

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