Domanda

L'uso di WCF in modo RESTful sembra fantastico. Sono un grande fan delle pistole grandi come la semplicità e la flessibilità, ma amo anche il modo in cui gli Url finiscono per apparire. Cosa posso dire, io & # 8217; m un programmatore.

L'API semplice per il recupero e la modifica delle risorse è accompagnata da un insieme quasi altrettanto semplice di possibili risposte di errore, e non posso & # 8217; t aiutare a sentirlo per mantenere un & # 8220; puro # 8221; Approccio RESTful Potrei tagliarmi il naso per dispetto per viso, o più specificamente, il naso dei miei consumatori di servizi web. Potrei sbagliarmi, ma non sembra che ci siano molti codici di errore Http che posso usare e nessun modo per restituire un messaggio di errore personalizzato.

Per chiarire, sto parlando di errori eccezionali adeguati e di errori non previsti. Voglio effettivamente comunicare un problema all'utente per aiutarlo a identificare ciò che deve fare per correggerlo.

Possibili opzioni che sto considerando ...

  1. Basta usare i codici di errore Http & # 8211; Sembra che sarebbe troppo restrittivo in ciò che sono in grado di esprimere, e non mi permetterebbe di fornire un messaggio personalizzato. Per favore (!) Correggimi se sbaglio.

  2. Restituisce sempre successo HTTP ma restituisce oggetti di errore personalizzati & # 8211; Ovviamente il più flessibile ma sicuramente non il più RESTful.

Gradirei davvero che qualcuno potesse condividere qualche esperienza nel mondo reale di questo particolare problema.


Aggiornamento

Grazie per il suggerimento di usare la proprietà StatusDescription dell'oggetto OutgoingWebResponseContext. All'inizio sembrava essere qualcosa che potevo usare.

Sono giunto alla conclusione che la mia seconda opzione sopra non è per me. Voglio attenermi a ciò che Http può darmi.

Tuttavia, ho problemi a farlo funzionare. Indipendentemente dal valore fornito per questa proprietà, non viene & # 8217; t viene restituito nella risposta.

Il mio metodo di servizio è simile a questo

public MyType GetMyTypes(string criteria)
{
    try
    {
        return GetMyTypes();
    }
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = HttpStatusCode.Forbidden;
        response.StatusDescription = "A Big fat error occurred";
        return null;
    }
}

Ed ecco il messaggio di risposta non elaborato. Non viene menzionato il messaggio personalizzato ...

  

HTTP / 1.1 403 Proibito
  Server: ASP.NET Development Server / 9.0.0.0
  Data: mer, 07 gen 2009 14:01:20 GMT
  Versione X-AspNet: 2.0.50727
  Cache-Control: privato
  Lunghezza contenuto: 0
  Connessione: Chiudi

Non è come se avessi solo bisogno di accedere alla proprietà corretta sul client. Le informazioni semplicemente non vengono inviate attraverso il collegamento.

Cosa fa realmente questa proprietà <=>?


Aggiornamento

Non ho mai scoperto come impostare la proprietà StatusDescription. Ho finito per non includere alcun messaggio di errore e andare solo con i codici di stato Http. Ho scelto di esporre gli endpoint Soap e Restful per i miei servizi, quindi i clienti possono scegliere quale preferiscono usare & # 8211; i semplici messaggi Restful o i messaggi Soap relativamente più ricchi.

È stato utile?

Soluzione

Invia il codice di risposta corretto e puoi fornire il messaggio di errore personalizzato nel corpo della risposta.

Altri suggerimenti

Con .net 4, lancia un < code> WebFaultException < T > (T errorDetail, HttpResponseCode code)

Qui imposti il ??tuo tipo di risposta su un altro tipo di oggetto, il che ha senso, e inoltre imposti il ?? ResponseCode che desideri.

errorDetail deve essere serializzabile

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

Aggiungo il codice di errore sia come sopra (nella descrizione dello stato) sia nel corpo della pagina restituita nei miei servizi REST come:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;

Vedi questa discussione per una domanda simile.

In poche parole, credo che puoi impostare il codice di stato HTTP (su uno dei codici di errore) e fornire il tuo messaggio personalizzato in StatusDescription proprietà:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

Purtroppo non so molto sulla prevalenza di questa tecnica nel mondo reale.

Questo potrebbe essere un difetto. A partire dal 22/09/2011, il problema è in fase di revisione da parte del team del prodotto:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response

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