C # HttpWebRequest / Response выдает 400 неверных запросов.Но не с Firefox HTTP Resource Test - PullRequest
1 голос
/ 13 сентября 2011

Мне нужно сделать запрос POST с данными XML.

String xml = "";
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
HttpClient.post(url, data, "text/xml")

Затем я вызываю функцию POST:

public static String post(String url, byte[] data, String contentType){
        String body = "";
        body = getResponse("POST", url, data, contentType, 80);
        return body;
    }

Теперь я вызываю эту функцию, чтобы сделать запрос / получить ответ:

public static String getResponse(String method, String url, byte[] data, String contentType, int serverPort)
    {
        String result = null;
        HttpWebRequest request = sendRequest(method, url, data, contentType, serverPort);
        HttpWebResponse response = null;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
            if (response != null){
                // Get the stream associated with the response
                Stream receiveStream = response.GetResponseStream ();
                // Pipes the stream to a higher level stream reader
                StreamReader readStream = new StreamReader (receiveStream, System.Text.Encoding.UTF8);
                result = readStream.ReadToEnd ();
            }
        }
        catch(WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError){
                throw new HttpClientException("HTTP response error. ", (int)(((HttpWebResponse)ex.Response).StatusCode), ((HttpWebResponse)ex.Response).StatusDescription);
            }
            else{
                throw new HttpClientException("HTTP response error with status: " + ex.Status.ToString());
            }
        }
}

и

public static HttpWebRequest sendRequest(String method, String url, byte[] data, String contentType, int serverPort){
        HttpWebRequest request = null;
        try
        {
            UriBuilder requestUri = new UriBuilder(url);
            requestUri.Port = serverPort;
            request = (HttpWebRequest)WebRequest.Create(requestUri.Uri);
            request.Method = method;
            //
            if ((method == "POST") && (data != null) && (data.Length > 0)){
                request.ContentLength = data.Length;
                request.ContentType = ((String.IsNullOrEmpty(contentType))?"application/x-www-form-urlencoded":contentType);
                Stream dataStream = request.GetRequestStream ();
                dataStream.Write (data, 0, data.Length);
                // Close the Stream object.
                dataStream.Close ();
            }
        }
        catch(WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError){
                throw new HttpClientException("HTTP request error. ", (int)(((HttpWebResponse)ex.Response).StatusCode), ((HttpWebResponse)ex.Response).StatusDescription);
            }
            else{
                throw new HttpClientException("HTTP request error with status: " + ex.Status.ToString());
            }
        }
}

Это всегда дает мне HttpCliendException:

video_api.HttpClientException: HttpClient exception :HTTP response error.  with `code: 400` and `status: Bad Request`

Но когда я попробовал это с аддоном Firefox HTTP Resource Test, он работал нормально и получил 202 Accepted status с тем же документом XML.

Я утешил тип содержимого и длину data.length до вызова пост-запроса, тип содержимого был text / xml, а data.length равен 143.

Ответы [ 4 ]

2 голосов
/ 13 сентября 2011

Используйте fiddler (http://www.fiddler2.com/fiddler2/), чтобы точно узнать, какие заголовки отправляются Firefox. Затем посмотрите, что отличается в отправляемых вами заголовках.

1 голос
/ 13 сентября 2011

Я знаю, что некоторые сайты требовательны к заголовкам запросов и возвращают разные результаты только на основании этих значений. Сравните заголовки запроса HTTP-запроса в FireFox и ваш запрос, и если вы имитируете заголовки в FireFox Resource Test, он, скорее всего, будет работать (Request.AddHeader("name", "value")). Другим отличием может быть пользовательский агент, который снова может быть разборчивым для веб-серверов.

0 голосов
/ 05 сентября 2014

Другим решением может быть то, что портятся порты SSL и NON-SSL.

Когда вы говорите простым http через порт https, ответ 400 Bad Request на Apache.

0 голосов
/ 29 июля 2013

В моем проекте я использую некоторые пользовательские настройки в config.area

    <defaultProxy useDefaultCredentials="true">
...
    </defaultProxy>

Это помогло мне отключить прокси:

request.Proxy = null;
...