У меня есть консольное приложение, которое использует около 20 потоков для подключения к удаленному веб-серверу и отправки произвольных http-запросов довольно небольшого размера, на 100% превышающих ssl. Удаленный веб-сервер на самом деле представляет собой весь центр обработки данных с балансировкой нагрузки, заполненный системами высокой доступности, которые могут обрабатывать сотни тысяч запросов в секунду. Это не проблема сервера или пропускной способности. С учетом сказанного я не запускаю его и не имею никакого влияния на его настройку, поэтому я не мог вносить изменения на стороне сервера, даже если бы захотел.
При запуске приложения с Fiddler приложение работает удивительно быстро. Когда он не работает в Fiddler, он намного медленнее, до такой степени, что бесполезен для стоящей перед ним задачи. Похоже, что в какой-то момент он также блокируется, но это может быть просто тупиковой проблемой, я пока не уверен.
Во всяком случае, fiddler, являющийся прокси, несомненно, каким-то образом модифицирует мои запросы / соединения, что обеспечивает прекрасную пропускную способность, однако я понятия не имею, что он делает. Я пытаюсь выяснить это так, чтобы я мог заставить мое приложение .net имитировать поведение обработки соединений fiddlers без необходимости запускать его через fiddler
Я вставил код подключения ниже.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace Redacted
{
public class HiveCommunicator
{
public static IResponse SendRequest(IRequest request) {
ServicePointManager.DefaultConnectionLimit = 60;
ServicePointManager.Expect100Continue = false;
string hostUrlString = string.Empty;
if (request.SiteID <= 0)
hostUrlString = string.Format("{0}://{1}{2}", request.UseSSL ? "https" : "http", DataCenters.GetCenter(request.DataCenter), request.Path);
else
hostUrlString = string.Format("{0}://{1}{2}", request.UseSSL ? "https" : "http", DataCenters.GetCenter(request.DataCenter), string.Format(request.Path, request.SiteID));
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(hostUrlString);
switch (request.ContentType)
{
default:
case ContentTypes.XML:
webRequest.ContentType = "application/xml";
break;
case ContentTypes.JSON:
webRequest.ContentType = "application/json";
break;
case ContentTypes.BINARY:
webRequest.ContentType = "application/octet-stream";
break;
}
if (request.RequiresAuthorizationToken)
{
AuthorizationToken tok = HiveAuthentication.GetToken(request.SiteID);
if (tok == null)
{
return null;
}
webRequest.Headers.Add(HttpRequestHeader.Authorization, tok.Token);
}
bool UsesRequestBody = true;
switch (request.HttpVerb)
{
case HttpVerbs.POST:
webRequest.Method = "POST";
break;
case HttpVerbs.DELETE:
webRequest.Method = "DELETE";
UsesRequestBody = false;
break;
case HttpVerbs.PUT:
webRequest.Method = "PUT";
break;
default:
case HttpVerbs.GET:
webRequest.Method = "GET";
UsesRequestBody = false;
break;
}
HttpWebResponse webResponse = null;
Stream webRequestStream = null;
byte[] webRequestBytes = null;
if (UsesRequestBody)
{
webRequestBytes = request.RequestBytes;
webRequest.ContentLength = webRequestBytes.Length;
webRequestStream = webRequest.GetRequestStream();
for (int i = 0; i < webRequest.ContentLength; i++)
{
webRequestStream.WriteByte(webRequestBytes[i]);
}
}
try
{
webResponse = (HttpWebResponse)webRequest.GetResponse();
}
catch (WebException ex)
{
webResponse = (HttpWebResponse)ex.Response;
}
if (UsesRequestBody)
{
webRequestStream.Close();
webRequestStream.Dispose();
}
IResponse respReturn = request.ParseResponse(webResponse);
webResponse.Close();
return respReturn;
}
}
}