2

我有一个asp.net mvc路由,它正在取得一个url并做一个简单的get和从请求中返回状态码。从Mvc路由返回不正确的http状态代码

<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)并转到网址http://www.facebook.com/blah.html,我得到预期的404返回。但是,如果我使用我的应用程序通过ajax调用来调用mvc路由,则获得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> 
+0

伟大的工作,谢谢! – 2011-04-27 20:31:39