问题  向网站发送HTTP请求/ POST

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
我仍然是C#的初学者。我有一个控制台应用程序。在javascript中,我们可以执行以下document.getElementById("myText").value = "玛丽;用于设置HTML元素。在将HTTP请求发送到网站的控制台应用程序中是否有可能,或者该应用程序使用的是post方法?请参阅下面的代码。网站上有一个标签名为testmedownelement的文本框(www。~~~~~~~~~~~~~~~~~~~~ .com)。

这是JavaScript代码:document.getElementsByName('testmedownelement')。value ="XXXXXX",由于我无法在控制台应用程序中使用Java脚本,因此我正在寻找C#等效项

C#:
            WebRequest request = WebRequest.Create("www.~~~~~~~~~~~~~~~~~~~~~~.com");
        

           request.Method = "GET";
            request.ContentType = "application/html";
            
          

            // Get the response.

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

            //Display Status

            Console.WriteLine(response.StatusDescription);

            // Get the stream containing content returned by the server.

            Stream dataStream = response.GetResponseStream();

            // Open the stream using a StreamReader for easy access.

            StreamReader reader = new StreamReader(dataStream);

            // Read the content.

            string responseFromServer = reader.ReadToEnd();

            // Display the content.

            Console.WriteLine(responseFromServer);

            // Cleanup the streams and the response.

            reader.Close();

            dataStream.Close();

            response.Close();

            Console.ReadKey();
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
单独使用VS2019无法解决问题。您仍然需要构建针对.NET Framework 4.8的代码。 VS2019的作用是让您选择那个目标。

顺便说一句,您也可以仅在命令行上使用.NET Framework 4.8 SDK来构建代码,但这将要求您使用VS Code或其他文本编辑器。由于您仍处于学习过程中,因此请保持简单并只需安装VS2019。您首先学习语言,然后再了解IDE实际为您完成的工作。

(是的,我们的C#人员并不像C和C ++人员那样严格,后者坚持要求您首先学习编译器和链接器的工作原理,然后再学习如何编写代码。)

感谢您的澄清。我所指的问题与我与控制台应用程序有关的401授权错误有关
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
TLS修复程序允许您与网站对话。现在您可以与之对话,您需要传递经过授权可以使用您尝试与之对话的Web服务的凭据。那不是技术问题,而是社会/安全问题。您是否与网站所有者进行过交谈,以了解您需要传递什么证书?
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
TLS修复程序允许您与网站对话。现在您可以与之对话,您需要传递经过授权可以使用您尝试与之对话的Web服务的凭据。那不是技术问题,而是社会/安全问题。您是否与网站所有者进行过交谈,以了解您需要传递什么证书?
我也知道网站的用户名和密码以及相关的网址信息,我是否还需要其他信息?
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
那么,您在哪里传递请求中的凭据?


在下面的代码的以下部分中

networkcredential使用用户名和密码
// credentialCache.Add(new System.Uri(url),"Basic",新的NetworkCredential(~~~~,~~~~~~~~~~~~));

C#:
private static CredentialCache GetCredential()
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)3072;
    string url = @"//~~~~~~~~~~~~~~~~~~~~~~.com/~~~~~";
    CredentialCache credentialCache = new CredentialCache();
    credentialCache.Add(new System.Uri(url), "Basic",新的NetworkCredential(~~~~,~~~~~~~~~~~~));
    return credentialCache;
}

public static void testcall (string url)
{

    WebRequest request = WebRequest.Create(url);
    request.PreAuthenticate = true;
    request.Credentials = GetCredential();

    ((System.Net.HttpWebRequest)request).Referer = url;
    ((System.Net.HttpWebRequest)request).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
    ((System.Net.HttpWebRequest)request).UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0";

    // Set the Method property of the request to POST.
    request.Method = "POST";
    // Create POST data and convert it to a byte array.
    string postData = "param1=XXXXXX";
    ASCIIEncoding encoding = new ASCIIEncoding();

    byte[] byteArray = encoding.GetBytes(postData);
    // Set the ContentType property of the WebRequest.
    request.ContentType = "application/x-www-form-urlencoded";
    // Set the ContentLength property of the WebRequest.
    request.ContentLength = byteArray.Length;
    // Get the request stream.
    Stream dataStream = request.GetRequestStream();
    // Write the data to the request stream.
    dataStream.Write(byteArray, 0, byteArray.Length);
    // Close the Stream object.
    dataStream.Close();



    // Get the response.
    WebResponse response = request.GetResponse();
    // Display the status.
    Console.WriteLine(((HttpWebResponse)response).StatusDescription);
    // Get the stream containing content returned by the server.
    dataStream = response.GetResponseStream();
    // Open the stream using a StreamReader for easy access.
    StreamReader reader = new StreamReader(dataStream);
    // Read the content.
    string responseFromServer = reader.ReadToEnd();
    // Display the content.
    Console.WriteLine(responseFromServer);
    // Clean up the streams.
    reader.Close();
    dataStream.Close();
    response.Close();
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
网站似乎不仅仅需要用户名和密码。它是否还需要包含其他秘密的标头或cookie?网站所有者告诉您什么有关如何使用直接Web请求而不是通过GUI对他们的网站进行身份验证的信息?
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
网站似乎不仅仅需要用户名和密码。它是否还需要包含其他秘密的标头或cookie?网站所有者告诉您什么有关如何使用直接Web请求而不是通过GUI对他们的网站进行身份验证的信息?

它只是用户名和密码,还是可以通过研究该网站来验证。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
TLS修复程序允许您与网站对话。
跳伞运动员,需要注意的是,如果您使用的是最新的.net版本,则不需要在请求中发送以下内容。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)3072; 4.8中不需要。
由于OP收到的错误是凭据身份验证的错误,因此也可能链接到TLS问题。辐照无关的代码是一个开始,上面建议运行最新版本的.net框架:
他首先需要做的是下载VS2019 Community Edition(免费),然后他可以在其中打开他的项目并将其更改为目标.Net 4.8
如果OP不尝试,他们将永远不会知道我引用的代码行是否是问题所在。但是正如我所说,Microsoft在v4.6中将其删除,我不再需要了,因为更高版本的.net为您确定了协议。
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
跳伞运动员,需要注意的是,如果您使用的是最新的.net版本,则不需要在请求中发送以下内容。

由于OP收到的错误是凭据身份验证的错误,因此也可能链接到TLS问题。辐照无关的代码是一个开始,上面建议运行最新版本的.net框架:

如果OP不尝试,他们将永远不会知道我引用的代码行是否是问题所在。但是正如我所说,Microsoft在v4.6中将其删除,我不再需要了,因为更高版本的.net为您确定了协议。
嗨,我刚刚安装了Visual Studio 2019,同样地,框架4.5在几次尝试后也无法自动与Visual Studio 2019集成。但最重要的是,我仍然在Visual Studio 2019中仍然收到远程服务器未经授权的401错误
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
您需要回顾一下我告诉您的内容。
我有一个控制台应用程序,可以使用4.8。

可以选择安装其他版本。

移至4.8,然后删除我告诉您删除的行。然后告诉我们您是否遇到新的错误?
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)3072; 4.8中不需要。
您的问题表明TLS或凭据有问题。

您将需要其他人的帮助。我要处理服务器部署。

查看屏幕截图,如果缺少任何版本,请安装
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
作为 @谢平 如上所述,默认情况下4.7及更高版本启用TLS 1.2。您的目标是4.5。如上所述,TLS 1.2仍无法解决您的401错误,因为这是一个不同的问题。与网站所有者交谈并找出需要进行身份验证的方式有什么问题?还是您是非法页面抓取他们的网站。
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
As @谢平 如上所述,默认情况下4.7及更高版本启用TLS 1.2。您的目标是4.5。如上所述,TLS 1.2仍无法解决您的401错误,因为这是一个不同的问题。与网站所有者交谈并找出需要进行身份验证的方式有什么问题?还是您是非法页面抓取他们的网站。

他们说用户名和密码是唯一需要的凭据。用户名和密码经过手动测试,工作正常。请不要做出任何错误的假设。在安装后,我只提到该框架是为了使其更加清晰。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
在原始帖子中,您提到使用JavaScript进行此操作,但是显示的唯一代码是在DOM上设置值。您从未真正展示过如何将表单发布回服务器,以便服务器获取您设置的值。您只是做一个普通的旧HTTP POST,还是需要设置一些标头或cookie?

所以问题是:在更改DOM时,用户是否必须手动登录网站?如果是这样,服务器是否发送回某种会话cookie或令牌来表示该会话?如果是这样,我们如何使用HTTP Web请求代码模拟相同的登录并获取cookie?

使用Fiddler(或您喜欢的任何Web代理工具-也许F12开发人员工具就足够了)。观看使用浏览器时发送的流量。将其与使用控制台应用程序时发送的流量进行比较。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
如上所述,TLS 1.2仍无法解决您的401错误,因为这是一个不同的问题。
不一定是正确的。如果请求的安全性不正确,则可能会出现401错误。在DIC上,我不久前回答了一个有关TLS的问题,在该线程的OP删除了TLS /更新的.Net行之后,他们的问题被放弃了,因此;为什么我建议使用4.8 .Net。使用TLS时,可能会引起一系列问题,导致401: TLS 401错误-Google搜索

由于用户正在使用TLS,服务器使用什么?服务器端证书还是客户端证书?如果这是双向TLS,则会遇到很多大问题。我也不喜欢这个主题的发展方向。如果有合法的API可以连接,那么就没有理由使用JS对DOM进行任何操作。这意味着,您尝试连接的该网站或服务器并不意味着以您尝试的方式连接。
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
不一定是正确的。如果请求的安全性不正确,则可能会出现401错误。在DIC上,我不久前回答了一个有关TLS的问题,在该线程的OP删除了TLS /更新的.Net行之后,他们的问题被放弃了,因此;为什么我建议使用4.8 .Net。使用TLS时,可能会引起一系列问题,导致401: TLS 401错误-Google搜索

由于用户正在使用TLS,服务器使用什么?服务器端证书还是客户端证书?如果这是双向TLS,则会遇到很多大问题。我也不喜欢这个主题的发展方向。如果有合法的API可以连接,那么就没有理由使用JS对DOM进行任何操作。这意味着,您尝试连接的该网站或服务器并不意味着以您尝试的方式连接。
我希望您知道有映射网站,可让您根据地址(DOM JS)等输入来确定相关的经/纬度,此外,这些网站还为您提供了进行API调用以及利用其配置来确定的选项相关的纬度/经度。同样,有时人们倾向于错误地朝解决API问题所需的方向看。并且还有可能导致401的一系列问题。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
抱歉,当您开始谈论纬度等问题时,您迷失了我。这些与我所说的有什么关系?
同样,有时人们倾向于错误地朝解决API问题所需的方向看。
真的吗?像什么?

如果我想从不接受数据请求的服务器上获取数据,则可以使用API​​来解决该问题。无论如何,我看不出您要在此处确定哪一点的相关性?
并且还有可能导致401的一系列问题。
是的,我有点指出,在我发布的链接中...无论如何,该回复中没有任何内容使您更接近解决问题。也许如果您也给我们提供了您要尝试连接的内容的链接,我们也许可以提出其他建议。从那以后,您是否安装了最新的VS社区版本以及Dotnet4.8,并删除了我之前提到的那行?
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
您的问题是,您正在尝试以服务器所有者可能不允许的方式连接到服务器。否则,您将对DOM感到厌烦,而您将向所有者API寻求答案。

你能告诉我那里的API吗?还是他们使用的API的文档?

如果他们有API,那么为什么要破坏DOM?

并且,如果服务器所有者希望您可以访问其资源,则他们将为您提供凭据和示例。

您尚未向我们显示此API,也未提供任何指向其文档或URI的链接。这使我们向您提供任何质量帮助变得更加困难。
 

nofu1

成员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
我已经放弃尝试创建控制台应用程序的工作,而是让他们只向我发送一个包含数据的.csv文件。但感谢大家的努力。
 
最佳 底部