Dati POST da un file di testo (letto da un client desktop) a un server basato su ASP .NET
Domanda
Sto sviluppando un'applicazione client-server - il server è un'app Web ASP .NET.
Il client (un'app desktop) deve inviare i dati contenuti in un file di testo alla mia app web asp .net. I dati sarebbero di circa 100 KB, in formato testuale multilinea.
Qual è l'approccio migliore per inviare questi dati al server, dato che devo farlo ogni 10 minuti circa?
Soluzione
Se il file è abbastanza piccolo da poterlo adattare facilmente in memoria (cosa che vorresti che fosse se lo stai inviando tramite POST) allora puoi semplicemente fare quanto segue:
string textFileContents = System.IO.File.ReadAllText( @"C:\MyFolder\MyFile.txt" );
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://www.myserver.com/myurl.aspx" );
request.Method = "POST";
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "fileContents=" + System.Web.HttpUtility.UrlEncode( textFileContents );
byte[] data = encoding.GetBytes( postData );
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write( data, 0, data.Length );
dataStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// do something with the response if required
Per quanto riguarda la lettura del lato server di testo, puoi semplicemente utilizzare Page.Request.Form [" fileContents " ]
Altri suggerimenti
Sono confuso; dici di volerlo come parametro POST, ma poi lo leggi da un'intestazione ...? Sarebbe il modulo per i campi postali tipici o solo il corpo della richiesta per i dati non elaborati ...
Per l'invio di campi modulo:
NameValueCollection fields = new NameValueCollection();
fields.Add("name1","some text");
fields.Add("name2","some more text");
using (var client = new WebClient())
{
byte[] resp = client.UploadValues(address, fields);
// use Encoding to get resp as a string if needed
}
Per inviare un file non elaborato (non come un modulo; solo il testo stesso), utilizzare UploadFile
; e per le intestazioni, utilizzare .Headers.Add
.
Se il tuo metodo web utilizza HttpContext.Current.Request.Headers [" errorLog "]
, l'applicazione client deve inviare questa intestazione http personalizzata quando esegue la richiesta. Si noti che le intestazioni http non sono pensate per inviare dati di grandi dimensioni.
Nell'applicazione client è possibile aggiungere un riferimento Web al servizio e utilizzare la classe proxy generata per sostituire GetWebRequest e aggiungi l'intestazione http personalizzata:
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
var req = (HttpWebRequest)base.GetWebRequest(uri);
var value File.ReadAllText("path_to_your_file");
req.Headers.Add("errorLog", value);
return (WebRequest)req;
}