【问题标题】:Is there another solution to WebResponse 403 error?WebResponse 403错误是否有另一种解决方案?
【发布时间】:2014-11-05 16:32:55
【问题描述】:

关于 WebResponse 403 错误的帖子很多,但我的情况有点不同。我创建了一个控制台应用程序,它将作为我的服务器上的任务运行。控制台应用程序在 WebRequest 中传递用户电子邮件并等待 WebResponse 接收带有返回参数的 uri。下面的代码几天前运行良好,但其他程序员之一为返回网址添加了一个新参数。我知道这会导致 403 错误,因为如果我使用新参数将 uri 粘贴到 IE 中,它就可以工作。但是因为我有一个控制台应用程序,所以我不能做返回网址,至少我不这么认为。

不幸的是,程序员说他不能改回来,并说有一种方法可以接收 uri 或整个页面内容,我可以那样处理。我仍然不知道他在说什么,因为 StreamReader 需要 WebResponse 以及我能想到的几乎所有其他解决方案。

即使我收到 403 错误,响应仍然包含带有我需要的参数的 uri,因为我可以在 IE 中的网址中看到它。所以我需要的只是响应uri。我将不胜感激您提供的任何帮助。以下是给我带来问题的方法。

String employeeInfo = "";
try
{
    HttpWebRequest request = (HttpWebRequest)WebRequest
        .Create("http://example.com/subsub.aspx?instprod=xxx&vabid=emailaddress");
    using (HttpWebResponse webResponse = 
        (HttpWebResponse)request.GetResponse()) //Error occurs here. 403 Forbidden
    {
        Uri myUri = new Uri(webResponse.ResponseUri.ToString());
        String queryParamerter = myUri.Query;
        employeeInfo = HttpUtility.ParseQueryString(queryParamerter).Get("vres");
        if (employeeInfo != "N/A")
        {
            return employeeInfo;
        }
        else
        {
            employeeInfo = "0";
            return employeeInfo;
        }
    }
}
catch (WebException)
{
    employeeInfo = "0";
    return employeeInfo;
}      

【问题讨论】:

  • 您是说您的情况有所不同,但很可能并非如此。 403 表示您未经身份验证。 Internet Explorer 很可能通过了 Windows 身份验证或类似的验证,这就是 IE 不会给您该错误的原因。你应该可以通过观察网络流量来验证(我推荐Fiddler)。您也可以直接询问其他程序员您需要提供哪种类型的身份验证。
  • 我向程序员询问了身份验证,他说我不需要提供身份验证。如果我将 uri 粘贴到 IE 中,我仍然会在页面正文中收到 403,但是响应 uri 包含我需要的新参数。
  • 所以你说 403 是完全可以预期的?如果不需要验证,也许你应该让其他程序员返回 200 OK 状态码。
  • 根据程序员的说法,是的。当他看到我遇到的问题时,他立即说我收到了错误,因为我没有传递返回页面让系统返回结果。换句话说,我的应用程序抛出了 403 错误,这对我来说毫无意义,因为我正在等待响应。
  • 这听起来很荒谬。也许尝试假装通过返回页面。他希望你如何通过返回页面?

标签: c# .net webrequest


【解决方案1】:

让我们关注Jim Mischel's 的想法。我们将处理 WebException 并使用异常的 Response 属性。

String employeeInfo = "";
try
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/subsub.aspx?instprod=xxx&vabid=emailaddress");
    using (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse()) //Error occurs here. 403 Forbidden
    {
        Uri myUri = new Uri(webResponse.ResponseUri.ToString());
        String queryParamerter = myUri.Query;
        employeeInfo = HttpUtility.ParseQueryString(queryParamerter).Get("vres");
        if (employeeInfo != "N/A")
        {
            return employeeInfo;
        }
        else
        {
            employeeInfo = "0";
            return employeeInfo;
        }
    }
}
catch (WebException ex)
{
    HttpWebResponse response = ex.Response as HttpWebResponse;
    if(response.StatusCode != HttpStatusCode.Forbidden)
    {
        throw;
    }
    Uri myUri = new Uri(response.ResponseUri.ToString());
    String queryParamerter = myUri.Query;
    employeeInfo = HttpUtility.ParseQueryString(queryParamerter).Get("vres");
    if (employeeInfo != "N/A")
    {
        return employeeInfo;
    }
    else
    {
        employeeInfo = "0";
        return employeeInfo;
    }  
}   

【讨论】:

  • 我就是这么想的。但是,您应该检查状态码以确保它是 403。如果是其他任何内容(例如 404 或 500),您可能不想尝试处理响应。
  • @mason 我修改了 catch 中的代码以处理我可能得到 403、404 和 500 的三个异常。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多