#vb.net #asp.net-mvc-2 #http-status-code-404 #http-status-codes
#vb.net #asp.net-mvc-2 #http-status-code-404 #http-status-codes
Вопрос:
У меня есть 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:
Если вы используете 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.
Также я бы, вероятно, использовал 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>