2015-09-15 16 views
10

Ho un servizio Restent WCF e vorrei che i metodi restituiscano HttpResponseMessage perché sembra strutturato piuttosto che semplicemente restituire i dati o l'eccezione o qualsiasi altra cosa potrebbe farcela da quella parte.WCF Restituzione di ritorno HttpResponseMessage vuole negoziare quando si imposta il contenuto

Suppongo che sia corretto, se non me lo consente, ma il mio problema è cosa succede quando provo a impostare HttpResponseMessage.Content. Quando faccio questo, il client in cui ho effettuato l'autenticazione richiesta di chiamata RESTful.

Ecco il mio codice:

Nell'interfaccia:

[WebGet(UriTemplate = "/GetDetailsForName?name={name}" 
        , ResponseFormat = WebMessageFormat.Json)] 
HttpResponseMessage GetDetailsForName(string name); 

Nella classe:

public HttpResponseMessage GetDetailsForName(string name) 
{ 
    HttpResponseMessage hrm = new HttpResponseMessage(HttpStatusCode.OK) 
     { 
     //If I leave this line out, I get the response, albeit empty 
     Content = new StringContent("Hi") 
     }; 

    return hrm; 
} 

ho voluto provare ad usare Request.CreateResponse, ma io non riesco a ottenere richiedere dal mio WCF metodo restful. OperationContext.Current.RequestContext non ha CreateResponse.

Eventuali suggerimenti?

+0

Quando si inserisce "Ciao" nel contenuto, cosa succede al cliente? –

+0

Apre la finestra delle credenziali del browser, anche se inserisco le credenziali, non mi viene autorizzato. – Matt

+0

Hai controllato qual è il tipo di media della risposta con e senza "Ciao"? –

risposta

1

Purtroppo questo non funzionerà. Il codice illustrato dice:

Costruire un oggetto HttpResponseMessage, serializzarlo con un serializzatore JSON e passare il risultato sul filo.

Il problema è HttpResponseMessage è monouso e non vuole essere serializzato, mentre StringContent non può essere serializzato affatto.

Quanto al motivo per cui si viene reindirizzati ad una forma di autenticazione - il servizio genera un'eccezione quando non può serializzare StringContent e restituisce un codice di stato HTTP 400 che viene interpretato come un problema di autenticazione.

+0

Hai un documento/riferimento per 'HttpResponseMessage è usa e getta e non è pensato per essere serializzato ?. E perché non è possibile serializzare 'StringContent'? – ANewGuyInTown

+0

Questa risposta spiega il funzionamento interno della situazione specifica in questione.In altri scenari, potresti essere in grado di serializzare quasi tutto in un modo o nell'altro. Se ti serve, fai semplicemente una nuova domanda con le tue specifiche. –

+0

No, stavo cercando di capire cosa hai citato nella tua risposta e ho fatto domande su cosa esattamente hai detto. Hai ragione che qualsiasi cosa può essere serializzata se vuoi, tuttavia, la modalità di serializzazione fornita o predefinita dal framework può rifiutarsi di _serialize_ in base a quali 'formattatori' stai usando e quali' attributi' sono presenti in _class/properties_ . – ANewGuyInTown

0

Se io chiedo, ad esempio, è gettato un pubblico GetDetails stringa (int ID) e un errore, questo funziona ...

catch(Exception ex) 
{ 
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse; 
response.StatusCode = System.Net.HttpStatusCode.OK; //this returns whatever Status Code you want to set here 
response.StatusDescription = ex.Message.ToString(); //this can be accessed in the client 
return "returnValue:-998,message:\"Database error retrieving customer details\""; //this is returned in the body and can be read from the stream 
}