Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过httpclient登录到安全网站,使用C刮取数据#_C#_Asp.net Mvc_Web Scraping - Fatal编程技术网

C# 通过httpclient登录到安全网站,使用C刮取数据#

C# 通过httpclient登录到安全网站,使用C刮取数据#,c#,asp.net-mvc,web-scraping,C#,Asp.net Mvc,Web Scraping,我必须在登录后从安全(https)网站删除数据,并将这些数据显示给我的MVC5应用程序。 登录后很容易从不安全的网站中删除数据,正如我使用以下方法所做的那样: public async Task<ActionResult> Index() { HttpClient client = new HttpClient(); var values = new Dictionary<string, string> {

我必须在登录后从安全(https)网站删除数据,并将这些数据显示给我的MVC5应用程序。 登录后很容易从不安全的网站中删除数据,正如我使用以下方法所做的那样:

 public async Task<ActionResult> Index()
    {
        HttpClient client = new HttpClient();

        var values = new Dictionary<string, string>
        {
           { "User.UserName", "abc" },
           { "User.Password", "abc" }
        };

        var content = new FormUrlEncodedContent(values);
        client.BaseAddress = new Uri("http://abc1.com/Account/Login");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
        var response= await client.PostAsync("http://abc1.com/Account/Login", content); 
        HttpResponseMessage response1 = await client.GetAsync("http://abc1.com/user/Index"); // This page data was reqired
        var responseString = await response1.Content.ReadAsStringAsync(); 
        ViewBag.LogedIn = responseString;
        return View();
    }
公共异步任务索引()
{
HttpClient=新的HttpClient();
var值=新字典
{
{“User.UserName”,“abc”},
{“用户密码”,“abc”}
};
var内容=新的FormUrlEncodedContent(值);
client.BaseAddress=新Uri(“http://abc1.com/Account/Login");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”);
var response=wait client.PostAsync(“http://abc1.com/Account/Login“,内容);
HttpResponseMessage response1=等待客户端。GetAsync(“http://abc1.com/user/Index“”;//需要此页面数据
var responseString=await response1.Content.ReadAsStringAsync();
ViewBag.LogedIn=响应字符串;
返回视图();
}
在此之后,我得到了下一页的数据在视图袋作为我的要求。但在Https网站的情况下,它是不工作的,也没有错误发生

请建议我在这个方法中应该做什么更改,以便它也可以登录到一个安全的网站


提前谢谢

我肯定你的代码中没有-

您可以使用邮递员发送请求以帮助调试错误。对这类事情很有帮助

可能您尝试连接的服务器使用的协议与您期望的不同

有关在代码中强制更改协议的更多信息,请查看此答案:-)


我确信你的代码中没有任何内容-

您可以使用邮递员发送请求以帮助调试错误。对这类事情很有帮助

可能您尝试连接的服务器使用的协议与您期望的不同

有关在代码中强制更改协议的更多信息,请查看此答案:-)


只需使用正确的地址即可
https
http
,处理方法相同。至于
没有发生错误
-您不检查响应的状态代码。你怎么知道没有错误?具有500状态代码的响应仍然是具有500状态代码的响应。它的内容可能包含一些关于错误的数据,也许不是。选中
response1。StatusCode
使用chrome开发者工具检查登录时发送的请求。也许你遗漏了一些重要的字段或标题。Reygoch和@PanagiotisKanavos感谢你的回复。。。我在请求后检查了状态代码,该代码始终为“ok”。但当我试图获取下一个页面时,它再次显示登录页面。请检查下面答案1中的评论。我在第一个评论中提供了详细信息。请发布一个完整的问题,解释您尝试了什么以及问题是什么。你所描述的是正常的行为。没有要报告的错误。您没有保留任何cookie,因此服务器无法知道您过去已登录。创建CookieContainer并将其添加到HttpClient只需使用正确的地址
https
http
,处理方法相同。至于
没有发生错误
-您不检查响应的状态代码。你怎么知道没有错误?具有500状态代码的响应仍然是具有500状态代码的响应。它的内容可能包含一些关于错误的数据,也许不是。选中
response1。StatusCode
使用chrome开发者工具检查登录时发送的请求。也许你遗漏了一些重要的字段或标题。Reygoch和@PanagiotisKanavos感谢你的回复。。。我在请求后检查了状态代码,该代码始终为“ok”。但当我试图获取下一个页面时,它再次显示登录页面。请检查下面答案1中的评论。我在第一个评论中提供了详细信息。请发布一个完整的问题,解释您尝试了什么以及问题是什么。你所描述的是正常的行为。没有要报告的错误。您没有保留任何cookie,因此服务器无法知道您过去已登录。创建CookieContainer并将其添加到HttpClientIt。登录门户似乎使用OpenID/oAuth作为身份验证方法。在这里查看更多关于此的信息-。有一些示例代码可以下载。您可能需要更改代码来实现OpenID。Postman还允许您使用oAuth身份验证(检查您请求的授权选项卡)但是你需要各种各样的凭证来获取有效的令牌还有一件我应该补充的事情——你可以使用postman中的拦截器功能在请求通过时“捕获”请求。你基本上打开拦截器,像平常一样登录到站点,然后你应该在你的邮递员历史记录中看到POST请求,这样你就可以检查它,看看哪里出了问题。考虑到您要刮取的站点使用的是OpenID/oAuth,它可能没有这样简单,但您至少应该看到所有请求,以便可以检查它们。是的,如果我通过同一个站点的另一个选项卡登录,并且在同一个请求之后,从rest客户端向我发送下一页数据。但是如果注销,则总是从RestClient的请求获得登录页。也意味着不能通过这个restclient登录。这是一个遗憾——这可能与OpenID/oAuth有关。我尝试了一个类似的方法,只使用了一个带有基本身份验证的标准登录页面,效果很好。您可以将请求与我前面提到的授权选项卡结合起来。不幸的是,我对oAuth知之甚少:-(看起来登录门户使用OpenID/oAuth作为身份验证方法。在这里查看更多信息-。这里有一些示例