8

Attualmente sto migrando il mio servizio RESTful WCF da .NET 3.5 (Starter Kit) a .NET 4. Ho iniziato il mio progetto utilizzando un modello di servizio Rest WCF da Visual Studio 2010. Ho dovuto capire come mantenere il mio schema di autorizzazione (formalmente fatto con RequestInterceptor) usando ServiceAuthorizationManager. Dopo un po 'di lavoro e di ricerche, l'ho fatto. Ma ora ho un problema collaterale. Il mio servizio è stato utilizzato per segnalare al mio cliente eventuali errori di elaborazione utilizzando il codice di stato HTTP e una breve descrizione. Stavo usando WebOperationContext in molti punti della mia metodo di servizio per descrivere ai clienti cosa è andato storto, come questo:WCF 4 Il servizio REST non può restituire una descrizione stato, solo StatusCode

protected void returnCode(HttpStatusCode code, string description) 
{ 
    WebOperationContext ctx = WebOperationContext.Current; 
    ctx.OutgoingResponse.StatusDescription = description; 
    ctx.OutgoingResponse.StatusCode = code; 
} 

Ma in WCF 4, solo StatusCode funziona - StatusDescription fallisce silenziosamente. Non riesco a capire perché. La mia unica ipotesi è che WebOperationContext non funzioni in questo nuovo scenario di WCF 4, e invece dovrei usare OperationContext, ma anche questo non funziona. Il seguente metodo è usato nella mia classe personalizzata che estende ServiceAuthorizationManager, informare i clienti di una richiesta non poteva essere l'accesso a causa di autenticazione Digest era malformato:

private void GenerateBadDigestMessage(ref OperationContext operationContext) 
{ 
    Message reply = Message.CreateMessage(MessageVersion.None, null, null, new DataContractJsonSerializer(typeof(object))); 

    HttpResponseMessageProperty hrp = new HttpResponseMessageProperty(); 
    hrp.StatusCode = HttpStatusCode.Forbidden; 
    hrp.StatusDescription = "bad digest"; 
    reply.Properties[HttpResponseMessageProperty.Name] = hrp; 

    operationContext.RequestContext.Reply(reply); 
    operationContext.RequestContext = null; 
} 

Anche utilizzando OperationContext direttamene qui (invece di WebOperationContext), StatusDescription non lo fa lavoro.

Cosa mi manca qui? Perché una cosa così piccola può andare da .NET 3.5 a 4?

+0

Self-hosted o IIS? Quale versione del server? Ho provato questo su 4.0 con Server 2008R2 self-hosted, e funziona bene (restituisce la descrizione dello stato come impostato). – nitzmahone

+0

Hai mai trovato una soluzione? Sono di fronte allo stesso problema. – Hemant

risposta

4

Si consiglia di utilizzare WebFaultException in .NET 4.0. Leggi ad esempio "Introducing WCF WebHttp Services in .NET 4". Prova

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden); 
+0

Siamo spiacenti ma l'uso di .NET 4.0 non è un'opzione. Hai avuto fortuna con .NET 3.5? – Hemant

+0

@Hemant: Ci scusiamo per l'incomprensione, ma si avvia la domanda con la parola, che si sta attualmente migrando il servizio da .NET 3.5 (Starter Kit) a .NET 4 e si riscontrano alcuni problemi.Quindi ti capisco che hai già una soluzione di lavoro in .NET 3.5 e vuoi che funzioni in .NET 4.0. Ho avuto lo stesso problema. In .NET 3.5 ho usato 'WebProtocolException' per segnalare gli errori. Dopo la migrazione a .NET 4.0 decido ** di non usare ** WCF REST Starter Kit deprecato. .NET 4.0 ha tutte le funzionalità necessarie per lo sviluppo di WCF REST. Invece di 'WebProtocolException' uso' WebFaultException'. – Oleg

+0

Grazie per la risposta. Inizialmente non ho fatto questa domanda. Stavo solo lottando con lo stesso problema e vedendo che sopra la domanda già fatta non ha risposte, metti una taglia su di essa. – Hemant

1

Un potenziale problema è che si sta impostando il RequestContext a nulla:

operationContext.RequestContext.Reply(reply);  
operationContext.RequestContext = null; 

Un'altra possibilità è che il parametro "description" non è impostato.

Anche sul lato client sono voi che controllate:

WebOperationContext.Current.IncomingResponse.StatusDescription 

più Una possibilità, potrebbe i valori sono stati sovrascritti dopo returnCode è stato chiamato?

2

OK! Ecco cosa ho scoperto. Non c'è niente di sbagliato nel mio codice. Non c'è niente di sbagliato con .NET framework 3.5 o 4.0.

Il problema è il server di sviluppo asp.net. Quando esegui il debug dell'applicazione di servizio, è probabile che sia ospitato sul server di sviluppo di asp.net e ignora completamente la descrizione dello stato fornita dall'applicazione. Refer this question.

Assegnare la taglia a @Oleg che almeno ha cercato di aiutarmi.

+0

Per inciso, questo è anche il motivo per cui non funziona in Web Api. Ho trovato la tua risposta e non appena ho eseguito il mio codice sotto IIS, la frase di ragionamento ha cambiato la descrizione dello stato. –

1

Assicurarsi di tornare dall'oggetto NULL del metodo di servizio ... in modo che la descrizione del codice di stato sia visibile nelle intestazioni di risposta, ha funzionato correttamente.