5

Sviluppo applicazione C# \ XAML metro-ui. Voglio chiamare un servizio e andare a usare HttpWebRequest per questo. La precedente realizzazione di HttpWebRequest contiene le proprietà ContentLength e UserAgent. Ma la realizzazione di WinRT non ce l'ha. Ho provato a utilizzare l'approccio descritto in questo post. Funziona per UserAgent ma non per ContentLength. Ho cercato di impostare HeadersCome aggiungere l'intestazione a HttpWebRequest nell'applicazione Windows8?

request.Headers["Content-length"] = Length; 
request.Headers["User-agent"] = UserAgent; 

Ma ha ricevuto l'eccezione "header 'Content-length' deve essere modificato utilizzando la proprietà o il metodo appropriato."

Hot è possibile impostare Headers in HttpWebRequest realizzato in WinRT?

+0

Se si rimuove l'impostazione di lunghezza del contenuto, funziona? È possibile che HttpWepRequest non ti permetta di impostare la lunghezza del contenuto perché lo calcola in base al contenuto che stai inviando. –

+0

@LarryOsterman No. Inoltre ho bisogno di impostare la proprietà 'Content-type'. Quindi dovrei commentare anche questo. Per approccio descritto tramite link: ricevo '400 Bad Request' quando ho commentato queste proprietà. Quando ho commentato questi per 'HttpWebRequest' ottengo webexception' La connessione sottostante è stata chiusa: la connessione è stata chiusa in modo imprevisto. – RredCat

+0

Hmmm. Riesco a vedere HttpWebRequest che blocca l'impostazione content-length (dato che può calcolare la lunghezza del contenuto). La cattiva richiesta implica che c'è qualcosa di sbagliato nel messaggio che viene inviato, che cosa Fiddler mostra che hai inviato? –

risposta

12

HttpWebRequest ha uno stato semi-deprecato in WinRT. Alcuni valori di intestazione che potrebbero essere precedentemente modificati su piattaforme .NET precedenti non possono più essere modificati con esso.

Sembra che lo HttpClient sia il nuovo e migliorato sostituto di HttpWebRequest con una semplice API e pieno supporto asincrono.

Dato che si desidera specificare Content-Length, presumo che si stia tentando di POST o PUT qualcosa al server. In tal caso, dovrai utilizzare PostAsync() o PutAsync() come appropriato.

var req = new HttpClient(); 
    req.DefaultRequestHeaders.Add("User-agent", UserAgent); 
    req.DefaultRequestHeaders.Add("Content-length", Length); 
    return await req.PostAsync(RequestURL, Body); 

Probabilmente non si ha realmente bisogno di specificare l'intestazione Content-length, dal momento che sarà incluso automaticamente da quei metodi basati sulla lunghezza effettiva del corpo, ma si può provare in entrambi i modi.

+0

Sì .. Hai ragione .. Grazie per la risposta. Sto giocando con qualcosa di simile .. Ma come posso vedere 'Body' è il tipo' HttpContent', giusto? E hai messo lì i tuoi parametri, vero? Potresti spiegare come hai inserito i parametri in istanza di 'HttpContent'? – RredCat

+0

L'ho trovato. Ho appena codificato i parametri stringa in 'ASCII'. Ma non è una soluzione completa. Ho menzionato in commento a @Larry Osterman che ho avuto problemi con l'impostazione di 'ContentType'. Ho trovato il modo di farlo - 'content.Headers.ContentType = new MediaTypeHeaderValue ("application/x-www-form-urlencoded");' In ogni caso, ti segnalo come risposta perché sei molto vicino a rispondere) – RredCat