Создание HttpWebRequest? Возникла ошибка ArgumentException - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь отправить данные на closure-compiler.appspot.com, используя его заголовок запроса.

Это заголовок запроса приложения.

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-9,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control: max-age=0
Content-Length: 269
Content-Type: application/x-www-form-urlencoded
Host: closure-compiler.appspot.com
Origin: null
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko)       Chrome/14.0.794.0 Safari/535.1

Вот что я сделал, чтобы создать этот запросв .NET

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://closure-compiler.appspot.com/compile");
req.Connection = "keep-alive";
req.Headers.Add("Cache-Control", "max-age=0");
req.Headers.Add("Origin","null");
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.794.0 Safari/535.1";
req.ContentType = "application/x-www-form-urlencoded";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
req.Headers.Add("Accept-Language", "tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4");
req.Headers.Add("Accept-Charset", " ISO-8859-9,utf-8;q=0.7,*;q=0.3");
req.Method = "POST";

Stream reqStr = req.GetRequestStream(); 
//this line give me an argumentexception 
//Keep-Alive and Close may not be set using this property.
//Parameter name: value

Так, как я могу создать заголовок, который приложение хочет, чтобы я отправил?

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Как насчет использования WebClient . Это сделает ваш код намного более читабельным, и в дополнение к этому вам не нужно бороться с правильной URL-кодировкой ваших параметров, закрывая потоки вокруг ...:

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            var values = new NameValueCollection
            {
                { "js_code", "var a = function(arg) { alert(arg); }; a('abc');" },
                { "compilation_level", "ADVANCED_OPTIMIZATIONS" },
                { "output_format", "text" },
                { "output_info", "compiled_code" },
            };
            var url = "http://closure-compiler.appspot.com/compile";
            var result = client.UploadValues(url, values);
            Console.WriteLine(Encoding.UTF8.GetString(result));
            // outputs 'alert("abc");' on the screen
        }
    }
}
1 голос
/ 18 июня 2011

Если я правильно прочитал ЭТО , вам нужно только установить ContentType, поэтому попробуйте сделать только следующее:

static void Main(string[] args)
{
    MemoryStream wStr = new MemoryStream();
    StreamWriter writer = new StreamWriter(wStr, Encoding.Default);
    writer.Write("js_code=" + HttpUtility.UrlEncode("alert('hello');// This comment should be stripped"));
    writer.Write("&compilation_level=" + HttpUtility.UrlEncode("WHITESPACE_ONLY"));
    writer.Write("&output_format=" + HttpUtility.UrlEncode("text"));
    writer.Write("&output_info=" + HttpUtility.UrlEncode("compiled_code"));
    writer.Flush();

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://closure-compiler.appspot.com/compile");
    req.ContentType = "application/x-www-form-urlencoded";
    req.Method = "POST";
    req.ContentLength = wStr.Length;

    Stream reqStr = req.GetRequestStream();
    reqStr.Write(wStr.ToArray(), 0, (int)wStr.Length);

    WebResponse res = req.GetResponse();
    Stream response = res.GetResponseStream();
    StreamReader reader = new StreamReader(response, Encoding.Default);

    Console.WriteLine(reader.ReadToEnd());
    Console.ReadLine();
}

Это сработало только для меня в правильном порядке (req.ContentLength необходимо установить перед записью) и кодировкой!

...