Возврат неверного кода статуса http из маршрута Mvc - PullRequest
2 голосов
/ 27 апреля 2011

У меня есть маршрут asp.net mvc, который принимает URL и выполняет простое получение и возврат кода состояния из запроса.

<AcceptVerbs(HttpVerbs.Post)> _
Public Function ValidateUrlStatusCode(ByVal url As String) As ActionResult
   Dim code As Integer = 0

   Try
      Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
      request.Method = "GET"
      request.AllowAutoRedirect = True
      Using response As HttpWebResponse = request.GetResponse
         response.Close()
         code = response.StatusCode
      End Using
   Catch ex As Exception
      code = HttpStatusCode.InternalServerError
   End Try
   Return Content(code, "text/plain")
End Function

Теперь, если я использую firefox (используя Firebug) и идуна URL http://www.facebook.com/blah.html, я получаю ожидаемое 404 возвращено.Однако, если я использую свое приложение для вызова маршрута mvc через вызов ajax, я получаю 200. Если я устанавливаю для объекта запроса AllowAutoRedirect значение false, я получаю 302. Я никогда не получаю 404. Я проверяю это еще раз через Firebug.Кто-нибудь может указать, что я делаю не так?

Спасибо!

1 Ответ

1 голос
/ 27 апреля 2011

Если вы используете FaceBook, убедитесь, что вы установили пользовательский агент, или сайт перенаправит вас на стандартную HTML-страницу, объясняющую вам, как это сделать (таким образом, код 200 статуса):

request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";

Также, когда из HttpWebRequest возвращается код состояния, отличный от 200, будет выдано исключение, а более конкретно - WebException . Поэтому вам нужно перехватить это WebException и внутри свойства Response , содержащего HttpWebResponse , вы найдете 404 StatusCode.

Также, вероятно, я бы использовал WebClient для упрощения кода:

Public Function ValidateUrlStatusCode(url As String) As ActionResult
    Dim code = 0
    Try
        Using client = New WebClient()
            client.Headers(HttpRequestHeader.UserAgent) = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0"
            Dim response = client.DownloadString(url)
        End Using
    Catch ex As WebException
        Dim httpResponse = TryCast(ex.Response, HttpWebResponse)
        If httpResponse IsNot Nothing Then
            code = CInt(httpResponse.StatusCode)
        End If
    End Try

    Return Content(code.ToString(), "text/plain")
End Function

А на клиенте:

<script type="text/javascript">
    $.ajax({
        url: '@Url.Action("ValidateUrlStatusCode")',
        type: 'POST',
        data: { url: 'http://www.facebook.com/blah.html' },
        success: function (result) {
            alert(result);
        }
    });
</script>
...