Разобрать необработанный HTTP-ответ в C #, чтобы получить код состояния - PullRequest
3 голосов
/ 21 июля 2011

Существует ли простой способ анализа строки ответа HTTP, такой как:

"HTTP/1.1 200 OK\r\nContent-Length: 1433\r\nContent-Type: text/html\r\nContent-Location: http://server/iisstart.htm\r\nLast-Modified: Fri, 21 Feb 2003 23:48:30 GMT\r\nAccept-Ranges: bytes\r\nETag: \"09b60bc3dac21:1ca9\"\r\nServer: Microsoft-IIS/6.0\r\nX-Po"

Я хотел бы получить код статуса. Мне не обязательно превращать это в HttpResponse объект, но это было бы приемлемо, так же как и просто разбор кода состояния. Смогу ли я разобрать это в HttpStatusCode enum?

Я использую подход, основанный на сокетах, и не могу изменить способ получения ответа. У меня будет только эта строка для работы.

Ответы [ 6 ]

5 голосов
/ 21 июля 2011

РЕДАКТИРОВАТЬ С учетом " Я использую подход, основанный на сокетах, и не могу изменить способ получения ответа. У меня будет только эта строка для работы с ".

Как насчет

  string response = "HTTP/1.1 200 OK\r\nContent-Length: 1433\r\nContent-Type: text/html\r\nContent-Location: http://server/iisstart.htm\r\nLast-Modified: Fri, 21 Feb 2003 23:48:30 GMT\r\nAccept-Ranges: bytes\r\nETag: \"09b60bc3dac21:1ca9\"\r\nServer: Microsoft-IIS/6.0\r\nX-Po";

  string code = response.Split(' ')[1];
  // int code = int.Parse(response.Split(' ')[1]);

Я изначально предлагал это:

  HttpWebRequest webRequest =(HttpWebRequest)WebRequest.Create("http://www.gooogle.com/");
  webRequest.AllowAutoRedirect = false;
  HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
  int statuscode = (int)response.StatusCode)
4 голосов
/ 21 июля 2011

HTTP - довольно простой протокол, следующий код должен довольно надежно выводить код состояния (обновлен, чтобы быть немного более устойчивым):

int statusCodeStart = httpString.IndexOf(' ') + 1;
int statusCodeEnd = httpString.IndexOf(' ', statusCodeStart);

return httpString.Substring(statusCodeStart, statusCodeEnd - statusCodeStart);

Если вы действительно хотите, вы можете добавить проверку работоспособности, чтобы убедиться, что строка начинается с «HTTP», но затем, если вам нужна надежность, вы также можете просто реализовать синтаксический анализатор HTTP.

Честно говоря, это возможно! : -)

httpString.Substring(9, 3);
2 голосов
/ 21 июля 2011

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

1 голос
/ 17 февраля 2014

Это обновляет помеченный ответ для обработки некоторых угловых случаев:

    static HttpStatusCode? GetStatusCode(string response)
    {
        string rawCode = response.Split(' ').Skip(1).FirstOrDefault();

        if (!string.IsNullOrWhiteSpace(rawCode) && rawCode.Length > 2)
        {
            rawCode = rawCode.Substring(0, 3);

            int code;

            if (int.TryParse(rawCode, out code))
            {
                return (HttpStatusCode)code;
            }
        }

        return null;
    }
1 голос
/ 21 июля 2011

Либо делайте то, что предлагает DD59, либо используйте регулярное выражение.

0 голосов
/ 21 июля 2011

, потому что формат кода состояния остается тем же, вы, вероятно, можете использовать что-то вроде этого.

var responseArray = Regex.Split(response, "\r\n");
 if(responseArray.Length)>0
 {
 var statusCode = (int)responseArray[0].split(' ')[1];
 }
...