Sockets in C#: Wie man den response-stream???
Ich versuche zu ersetzen:
void ProcessRequest(object listenerContext)
{
var context = (HttpListenerContext)listenerContext;
Uri URL = new Uri(context.Request.RawUrl);
HttpWebRequest.DefaultWebProxy = null;
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
httpWebRequest.Method = context.Request.HttpMethod;
httpWebRequest.Headers.Clear();
if (context.Request.UserAgent != null) httpWebRequest.UserAgent = context.Request.UserAgent;
foreach (string headerKey in context.Request.Headers.AllKeys)
{
try { httpWebRequest.Headers.Set(headerKey, context.Request.Headers[headerKey]); }
catch (Exception) { }
}
using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
Stream responseStream = httpWebResponse.GetResponseStream();
if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
else if (httpWebResponse.ContentEncoding.ToLower().Contains("deflate"))
responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
MemoryStream memStream = new MemoryStream();
byte[] respBuffer = new byte[4096];
try
{
int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
while (bytesRead > 0)
{
memStream.Write(respBuffer, 0, bytesRead);
bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
}
}
finally
{
responseStream.Close();
}
byte[] msg = memStream.ToArray();
context.Response.ContentLength64 = msg.Length;
using (Stream strOut = context.Response.OutputStream)
{
strOut.Write(msg, 0, msg.Length);
}
}
catch (Exception ex)
{
//Some error handling
}
}
mit sockets. Dies ist, was ich habe, so weit:
void ProcessRequest(object listenerContext)
{
HttpListenerContext context = (HttpListenerContext)listenerContext;
Uri URL = new Uri(context.Request.RawUrl);
string getString = string.Format("GET {0} HTTP/1.1\r\nHost: {1}\r\nAccept-Encoding: gzip\r\n\r\n",
context.Request.Url.PathAndQuery,
context.Request.UserHostName);
Socket socket = null;
string[] hostAndPort;
if (context.Request.UserHostName.Contains(":"))
{
hostAndPort = context.Request.UserHostName.Split(':');
}
else
{
hostAndPort = new string[] { context.Request.UserHostName, "80" };
}
IPHostEntry ipAddress = Dns.GetHostEntry(hostAndPort[0]);
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(ipAddress.AddressList[0].ToString()), int.Parse(hostAndPort[1]));
socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ip);
BEGINNEN NEUE CODE
Encoding ASCII = Encoding.ASCII;
Byte[] byteGetString = ASCII.GetBytes(getString);
Byte[] receiveByte = new Byte[256];
string response = string.Empty;
socket.Send(byteGetString, byteGetString.Length, 0);
Int32 bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
response += ASCII.GetString(receiveByte, 0, bytes);
while (bytes > 0)
{
bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);
}
socket.Close();
string separator = "\r\n\r\n";
string header = strPage.Substring(0,strPage.IndexOf(separator));
string content = strPage.Remove(0, strPage.IndexOf(separator) + 4);
byte[] byteResponse = ASCII.GetBytes(content);
context.Response.ContentLength64 = byteResponse .Length;
context.Response.OutputStream.Write(byteResponse , 0, byteResponse .Length);
context.Response.OutputStream.Close();
ENDE NEUER CODE
Nach dem anschließen an die Steckdose, weiß ich nicht, wie man den Stream Antwort zu entpacken, und senden Sie zurück zu Kontext.Antwort.Ausgabestrom
Jede Hilfe wird geschätzt.
Danke.
Cheers.
EDIT 2:
Mit dieser edit-scheint nun einwandfrei zu funktionieren (gleiche wie HttpWebRequest zumindest). Finden Sie irgendwelche Fehler hier?
EDIT 3:
Falscher alarm... kann immer Noch nicht diese arbeiten
EDIT 4:
Ich brauchte die folgenden Zeilen hinzu, um Scott ' s code ... weil nicht immer das erste Byte von reponseStream sind die gzip magic number.
Die Reihenfolge scheint zu sein: 0x0a (10), 0x1f (31), 0x8b (139). Die letzten beiden sind die gzip magic number. Die erste Zahl war vorher immer in meinen tests.
if (contentEncoding.Equals("gzip"))
{
int magicNumber = 0;
while (magicNumber != 10)
magicNumber = responseStream.ReadByte();
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
Die Antwort ist hier: stackoverflow.com/questions/521977/...
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier finden Sie den code, das funktioniert für mich.
Könnte man ersetzen, das für die Buchse/NetworkStream, und speichern Sie ein bisschen arbeiten.
Es laufen im debug und überprüfen Sie, dass die ersten paar bytes 0x1f 0x8b (gzip magic number), gibt es vielleicht eine extra Zeile oder Präfix oder so etwas.
Vielen Dank für die Antwort. Ich habe ein paar Zeilen nach "if (contentEncoding.Equals("gzip")) {" zu suchen, die Anfang der gzip magic number. Es ist in meinem ersten post. Beste Grüße!
InformationsquelleAutor
Buchse, per definition, ist die low-level-Zugriff auf das Netzwerk. Sie können auch Datagramm-Protokolle mit einer Steckdose. In diesem Fall wird ein stream keinen Sinn überhaupt.
Während ich bin mir nicht sicher, warum Sie tun, was HttpWebRequest-leicht leistet, Lesen/schreiben von Daten in eine Steckdose, verwenden Sie die Send/Receive-Methoden. Wenn Sie möchten, um einen Strom wie den Zugriff auf einen TCP-socket, sollten Sie die TcpClient/TcpListener-Klassen, die wrap-a-Buchse und stellen Sie ein Netzwerk-stream.
InformationsquelleAutor
Gibt es auch die NetworkStream-Klasse, nimmt einen Socket als parameter. 😉
InformationsquelleAutor