Как создать HTTP-запрос вручную в.Net?
Я хотел бы создавать свои собственные HTTP-запросы. Класс WebClient очень классный, но он автоматически создает HTTP-запросы. Я думаю, мне нужно создать сетевое соединение с веб-сервером и передать мои данные через этот поток, но я не знаком с библиотечными классами, которые бы поддерживали подобные вещи.
(В контексте я работаю над кодом для класса веб-программирования, который я преподаю. Я хочу, чтобы мои ученики поняли основы того, что происходит внутри "черного ящика" HTTP.)
5 ответов
Чтобы по-настоящему понять внутреннюю часть протокола HTTP, вы можете использовать класс TcpClient:
using (var client = new TcpClient("www.google.com", 80))
{
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
writer.AutoFlush = true;
// Send request headers
writer.WriteLine("GET / HTTP/1.1");
writer.WriteLine("Host: www.google.com:80");
writer.WriteLine("Connection: close");
writer.WriteLine();
writer.WriteLine();
// Read the response from server
Console.WriteLine(reader.ReadToEnd());
}
}
Другая возможность - активировать трассировку, добавив в app.config
и просто используйте WebClient для выполнения HTTP-запроса:
<configuration>
<system.diagnostics>
<sources>
<source name="System.Net" tracemode="protocolonly">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
</sources>
<switches>
<add name="System.Net" value="Verbose"/>
</switches>
<sharedListeners>
<add name="System.Net"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="network.log" />
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
</configuration>
Затем вы можете выполнить HTTP-вызов:
using (var client = new WebClient())
{
var result = client.DownloadString("http://www.google.com");
}
И, наконец, проанализировать сетевой трафик в сгенерированном network.log
файл. WebClient
также будет следовать перенаправлениям HTTP.
При необходимости используйте классы WebRequest или WebResponse.
Если вам нужно перейти на более низкий уровень, чем это предусмотрено, посмотрите на другие System.Net.Sockets.* Клиентские классы, такие как TcpClient.
Проверять, выписываться System.Net.Sockets.TcpClient
если вы хотите написать свой собственный клиент низкого уровня. Для HTTP GET и POST вы можете использовать HttpWebRequest
а также HttpWebResponse
классы хотя.
Если вы действительно мазохист, вы можете пойти ниже, чем TcpClient
и реализовать свой собственный Socket
Смотрите класс Socket.
В своем ответе на эту публикацию по SharePoint 2007 о том, как проверить, существует ли папка в библиотеке документов, я включил основы создания HttpWebRequest и чтения ответа.
Изменить: добавил пример кода из поста выше
System.Net.HttpWebRequest oReq;
string sUrl = "http://yoursite/sites/somesite/DocumentLibrary";
oReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(sUrl);
oReq.Method = "GET";
oReq.Credentials = System.Net.CredentialCache.DefaultCredentials;
oReq.AllowAutoRedirect = true;
//now send the request
using (System.IO.StreamWriter oRequest =
new System.IO.StreamWriter(oReq.GetRequestStream())) {
oRequest.WriteLine();
}
//and read all the response
using (System.Net.HttpWebResponse oResponse = oReq.GetResponse()){
using (System.IO.StreamReader oResponseReader =
new System.IO.StreamReader(oResponse.GetResponseStream())){
string sResponse = oResponseReader.ReadToEnd();
}
}
Используйте WFetch для демонстрации.
Что касается программирования, HttpWebRequest позволяет вам немного контролировать запрос - опять же, если бы это было для демонстрации, я бы использовал Wireshark, чтобы понюхать, что происходит по проводам, когда вы выполняете различные задачи с помощью HttpWebRequest.