2013-06-14 1 views
5

Il mio codice deve fornire alcune informazioni a un server tramite uno script php.In C#, è possibile aprire un URL in background, senza aprire un browser?

Fondamentalmente voglio chiamare www.sitename.com/example.php?var1=1&var2=2&var3=3 ma non voglio che il browser si apra, quindi Process.Start(URL); non funzionerà.

Da quando vengo in questo sito per imparare e non per ottenere risposte, soprattutto, spiegherò cosa ho fatto finora e gli errori che ho ottenuto. Se conosci comunque una soluzione, sentiti libero di saltare la parte successiva.

Ho guardato intorno, e ho visto una soluzione per l'utilizzo di POST:

ASCIIEncoding encoding=new ASCIIEncoding(); 
string postData="var1=1&var2=2&var3=3"; 
byte[] data = encoding.GetBytes(postData); 

// Prepare web request... 
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://localhost/site.php"); 
myRequest.Method = "POST"; 
myRequest.ContentType="application/x-www-form-urlencoded"; 
myRequest.ContentLength = data.Length; 
Stream newStream=myRequest.GetRequestStream(); 

// Send the data. 
newStream.Write(data,0,data.Length); 
newStream.Close(); 

Tuttavia, richiedono l'uso di GET non POST. Inizialmente ho pensato che la soluzione potesse essere quella di cambiare myRequest.Method = "POST"; in GET, ma questo non ha funzionato perché non è così che funziona GET, esso estrae i dati dall'URL.

Così, poi ho cercato di modificare il codice precedente:

HttpwebRequest myRequest= (HttpWebRequest)WebRequest.Create("http://localhost/site.php" + postData); 
Stream newStream = myRequest.GetRequestStream(); 
newStream.Close() 

Sotto la logica che avrebbe chiamato l'URL, che (si spera) avviare la richiesta get_ sullo script php, e poi la vita sarebbe dandy Questo tuttavia ha portato alla seguente errore:

A first chance exception of type 'System.Net.ProtocolViolationException' occurred in System.dll 
An unhandled exception of type 'System.Net.ProtocolViolationException' occurred in System.dll 
Additional information: Cannot send a content-body with this verb-type. 

Qualsiasi aiuto è apprezzato, e grazie.

risposta

4
string postData="var1=1&var2=2&var3=3"; 
// Prepare web request... 
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(
        "http://yourserver/site.php?" + postData); 
myRequest.Method = "GET"; 
var resp =(HttpWebResponse) myRequest.GetResponse(); 

var result = new StreamReader(resp.GetResponseStream()).ReadToEnd(); 

O forse ancora più semplice:

var data = new WebClient().DownloadString("http://yourserver/site.php?var1=1&var2=2&var3=3"); 

vedere la classe WebClient per ulteriori opzioni

+0

per la prima soluzione, Visual Studio 2012 produce ed evidenzia ed evidenzia 'Stream newStream = myRequest.GetRequestStream();' per la seconda soluzione, non viene prodotto alcun errore, ma la pagina php non sembra registrare nulla . – echolocation

+0

Se si utilizza [violinista] (http://fiddler2.com/) è possibile vedere quali chiamate vengono eseguite sul proxy di sistema. – rene

+0

Ho trovato il problema. Per accedere a http: // yourserver/site.php' ho bisogno dell'autenticazione tramite un server di autenticazione centrale. Quindi, quando provo ad accedere al sito, mi reindirizza prima all'autenticazione. Sapete comunque di averlo passato, visto che ho il nome utente e la password corretti? Grazie per qualsiasi aiuto – echolocation

0

Il modo più semplice è quello di utilizzare WebClient classe. Usandolo è solo 2 linee di codice, basta fornire il tuo URL e utilizzare metodi come DownloadString.

2

È in gran parte sembrano aver seguito la strada giusta:

string postData="var1=1&var2=2&var3=3"; 

// Prepare web request... 
HttpwebRequest myRequest= (HttpWebRequest)WebRequest.Create(
    "http://localhost/site.php?" + postData); 

// Send the data. 
myRequest.GetResponse(); 

Nota che ho aggiunto il ? alla fine del site.php.

Non dobbiamo smanettare con lo stream della richiesta poiché si tratta di mettere le cose nel corpo di una richiesta e, come hai affermato, una richiesta GET ha i suoi dati nell'URL, non nel suo corpo .

+0

anche se questo è molto comune, e funzionerà in come 99.9% di tutti i casi possibili, questo non è il modo in cui HTTP era destinato a funzionare ... RFC2616 Sezione 9.1.1 afferma "che i metodi GET e HEAD NON DOVREBBERO avere il significato di intraprendere un'azione diversa dal recupero" – DarkSquirrel42