0

我有以下情况。我正在调用一些 web api 来登录到某个服务器。调用看起来像这样: webhost/login?username=email@domain.com&password=alin 返回总是一个像这样的 xml:

<response>
 <error>invalid user</error>
</response>

或者

<response>
 <token>XXXXXXX</token>
</response>

所以,如果我用错误的凭据调用这个 api,页面返回 401 http 状态,然后在这一行

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

它引发一个错误,并在 catch 块中跳转。(当然)问题是,下一行

stream = response.GetResponseStream();

永远不会发生,所以我永远不会阅读返回的 xml ,包括其中的错误消息。不过,如果我只是将链接粘贴到浏览器中,页面和 xml 就会被加载

为什么浏览器会加载 xml 而我的响应组件却没有。顺便说一句,我在 C# 中这样做

谢谢

Stream stream = null;
try 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(finalURL);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    stream = response.GetResponseStream();
}  
catch(Exception ex)
{
    string x = ex.Message;
}
4

3 回答 3

3

好吧,您不是在尝试查看响应。

如果你捕捉到一个特定的异常(你应该这样做——Exception在大多数情况下捕捉是一个坏主意),你可以获得响应数据:

catch (WebException e)
{
    WebResponse response = e.Response;
    // TODO: Check whether the status code is one you can handle
    // Get the data from here...
}

请注意,您也应该在非失败条件下using为您的声明HttpWebResponse,否则您最终将打开资源。

于 2012-07-27T10:17:09.080 回答
0

尝试这个:

if (ex is WebException)
{
    var webException = ex as WebException;
    var response = (HttpWebResponse)webException.Response;

    switch (response.StatusCode)
     {
           case HttpStatusCode.Unauthorized:

               var responseStream = response.GetResponseStream();
              break;

       }  
} 
于 2012-07-27T10:17:00.037 回答
0

找出浏览器的用户代理字符串,然后将 WebRequest 上的用户代理字符串设置为匹配。许多站点提供基于 UA 的变体内容/标记/样式/脚本。

对于HttpWebRequest,您可以通过 UserAgent 属性设置 UA。

看看这是否有帮助。

于 2012-07-27T10:18:28.707 回答