की तरह व्यवहार करने के लिए सी # एप्लिकेशन कैसे बनाएं मेरे पास एक कंसोल ऐप है जो रिमोट वेब सर्वर से कनेक्ट करने के लिए 20 या तो थ्रेड का उपयोग करता है और मनमाने ढंग से http अनुरोधों को छोटे आकार में भेजता है, एसएसएल पर 100%। रिमोट वेब सर्वर वास्तव में एक उच्च लोड संतुलित डेटा सेंटर है जो उच्च उपलब्धता प्रणाली से भरा है जो प्रति सेकंड सैकड़ों हजारों अनुरोधों को संभाल सकता है। यह एक सर्वर या बैंडविड्थ मुद्दा नहीं है। ऐसा कहा जा रहा है कि, मैं इसे नहीं चलाता, न ही मुझे इसका कोई प्रभाव पड़ता है कि यह कैसे कॉन्फ़िगर किया गया है, इसलिए यदि मैं चाहता हूं तो भी मैं सर्वर पक्ष में परिवर्तन नहीं कर सका।Fttler
फिडलर के साथ ऐप चलाने पर ऐप आश्चर्यजनक तेज़ प्रदर्शन करता है। जब फिडलर में नहीं चल रहा है तो यह वास्तव में बहुत धीमी है, काम के लिए बेकार होने के बिंदु पर। यह प्रक्रिया के शुरुआती दिनों में कुछ बिंदु पर लॉक लग रहा है, लेकिन यह केवल एक डेडलॉक मुद्दा हो सकता है, मुझे अभी तक यकीन नहीं है।
किसी भी तरह, फिडलर प्रॉक्सी होने के नाते, निस्संदेह मेरे अनुरोध/कनेक्शन को किसी भी तरीके से संशोधित कर रहा है जो अद्भुत थ्रूपुट सुनिश्चित करता है, हालांकि मुझे नहीं पता कि यह क्या कर रहा है। मैं इसे समझने की कोशिश कर रहा हूं ताकि मैं अपने .net एप्लिकेशन को फिडलर कनेक्शन हैंडलिंग व्यवहार की नकल करने के लिए मजबूर कर सकूं, वास्तव में इसे फिडलर
के माध्यम से चलाने के लिए मैंने नीचे कनेक्शन कोड चिपकाया है।
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;
}
}
}
मैंने इस हेडर के साथ भी समस्याओं में भाग लिया है। मैं समझ नहीं पा रहा हूं कि एमएस ने इसे बदलने में इतना मुश्किल क्यों बनाया है। –