Menu

 向网站发送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 和 the response.

            reader.Close();

            dataStream.Close();

            response.Close();

            Console.ReadKey();
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,502
地点
悉尼,澳大利亚
编程经验
10+
在JavaScript中,您需要处理浏览器中加载的HTML页面的DOM。这对服务器完全没有影响。仅当您将该页面中的表单发布到服务器时,表单数据(包括您设置的值)才会被处理。如果您使用的是控制台应用程序,则没有HTML页面,因此没有DOM可以操作。由您决定构造并发送一个帖子到服务器,该帖子包含与提交网页表单所发送的数据相同的数据。没有文档,所以没有元素。您只需要以与该HTML页面上的表格相同的格式发送适当的数据即可。
 

nofu1

会员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
感谢Jmcilhinney,我怀疑如此,关于如何构建和发送帖子到服务器的教程很好,例如,如何知道格式,要传递多少参数以及参数的顺序。


例如,我尝试使用post方法对代码进行以下修改,但收到错误消息,底层连接已关闭:发送时发生意外错误

C#:
WebRequest request = WebRequest.Create("www.~~~~~~~~~~~~~~~~~~~~~~.com");
request.Method = "POST";
request.ContentType = "application/html";

string thinginfo = "XXXXXX";
request.Headers.Add("testmedownelement", thinginfo);
         
// 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 和 the response.
reader.Close();
dataStream.Close();
response.Close();
Console.ReadKey();
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
Sounds like you might be dealing with a TLS issue. If so, this would also suggest that you are using an older version of .net than 4.6. On your WebRequest.Create(", specify the http/https protocol. You also need to know the exact address of your forms post uri. Every form has an action uri that a form is submitted too :
<form role="form" id="myform" action="/somefile.ext" method="post">
即使如此,这也不是合适的方法。如果它是您的服务器,则为您的服务器创建一个API。

请参阅以下Web请求示例和文档: 如何:使用WebRequest类发送数据
如何知道格式,要传递多少参数
与知道操作uri如何知道表单将发送的值没有什么不同。你也应该如果不是您的服务器,我会建议类似 .

您可能还会发现这里的答案很有用: 如何使用C#提交http表单
 

nofu1

会员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
Sounds like you might be dealing with a TLS issue. If so, this would also suggest that you are using an older version of .net than 4.6. On your WebRequest.Create(", specify the http/https protocol. You also need to know the exact address of your forms post uri. Every form has an action uri that a form is submitted too :
<form role="form" id="myform" action="/somefile.ext" method="post">
即使如此,这也不是合适的方法。如果它是您的服务器,则为您的服务器创建一个API。

请参阅以下Web请求示例和文档: 如何:使用WebRequest类发送数据

与知道操作uri如何知道表单将发送的值没有什么不同。你也应该如果不是您的服务器,我会建议类似 .

您可能还会发现这里的答案很有用: 如何使用C#提交http表单
嗨,我能够修改代码,但现在收到401授权错误。请在下面查看修改后的代码

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

public static void testcall (string url)
        {
     
            WebRequest request = WebRequest.Create(url);
            request.PreAuthenticate = 真正;
            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 和 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();
        }
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (安全协议类型)3072;
如果您正在运行最新版本的dotnet框架,则无需执行此操作。最新版本可为您解决此问题。

您正在运行什么版本?

您需要发送一个 WWW认证 标头,其中包含有关如何授权操作的信息。 401表示您没有为尝试访问的任何资源使用正确的凭据。

在此阶段,我建议您调试代码,并确保所有操作均按预期进行。抱歉,由于我目前很忙,我没有更多的时间为您提供进一步的帮助。也许其他人之一可以介入并提供帮助。您可以在这里阅读更多有关您的错误的信息: 401未经授权-httpstatuses.com
 

nofu1

会员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
如果您正在运行最新版本的dotnet框架,则无需执行此操作。最新版本可为您解决此问题。

您正在运行什么版本?

您需要发送一个 WWW认证 标头,其中包含有关如何授权操作的信息。 401表示您没有为尝试访问的任何资源使用正确的凭据。

在此阶段,我建议您调试代码,并确保所有操作均按预期进行。抱歉,由于我目前很忙,我没有更多的时间为您提供进一步的帮助。也许其他人之一可以介入并提供帮助。您可以在这里阅读更多有关您的错误的信息: 401未经授权-httpstatuses.com
我正在运行asp.net 3.5。感谢所有帮助
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
但是,为什么要在3.5以下运行? o_O 完成Windows更新。安装最新的dotnet框架...

在您的项目设置中。更改您的框架:
在您的项目中,将目标框架更改为4.8,然后告诉我它是否对401错误有影响。事实并非如此,您可能需要考虑服务器如何认证请求。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我正在运行asp.net 3.5。感谢所有帮助
我以为您说您是作为控制台应用程序运行的?

如果您将其作为.net mvc3剃刀应用程序运行。在您的web.config中进行此更改。
<system.web>
<compilation debug="true" targetFramework="4.8" />
<httpRuntime targetFramework ="4.8" />
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
关于什么 @跳伞 请参阅p / 1#6有关要求。在更高版本的Dotnet框架中,不需要上面Skydiver提到的TLS要求。
 

nofu1

会员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
但是,为什么要在3.5以下运行? o_O 完成Windows更新。安装最新的dotnet框架...

在您的项目设置中。更改您的框架:
在您的项目中,将目标框架更改为4.8,然后告诉我它是否对401错误有影响。事实并非如此,您可能需要考虑服务器如何验证请求
这是一个控制台应用程序,我看到的最大.net目标框架是3.5。抱歉,我可能误解了这一点和建议,
对于TLS 1.2支持,将该值进行掩码将是您唯一的选择。

你能帮忙澄清一下解决方案吗
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
抱歉,我可能误解了这一点和建议,
好的:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (安全协议类型)3072;
好...
如果您正在运行最新版本的dotnet框架,则无需执行此操作。最新版本可为您解决此问题。
如果您运行最新的点网框架,则无需在那儿放那条线。

然后是这个:
我正在运行asp.net 3.5。感谢所有帮助
和:
这是一个控制台应用程序,我看到的最大.net目标框架是3.5。
哪有
 

nofu1

会员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
Ok This :

好...

如果您运行最新的点网框架,则无需在那儿放那条线。

然后是这个:

和:

哪有
这是一个控制台应用程序。在Visual Studio中,如果我右键单击.csproj文件,然后转到应用程序选项卡,它将显示

目标框架:.net Framework 3.5
和输出类型:控制台应用程序
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我有一个控制台应用程序,可以使用4.8。

可以选择安装其他版本。

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

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

附件

  • 截图_38.jpg
    截图_38.jpg
    202.6 KB · 观看次数: 4

nofu1

会员
已加入
2020年10月30日
留言内容
23
编程经验
Beginner
我安装了.net 4.8框架,但没有与Visual Studio自动集成。换句话说,它不像您一样包含在下拉列表中
visual_studio_screenshot.png
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
您需要安装.NET Framework SDK,而不是.NET Framework运行时,以使其显示在VS列表中。

此外,选项卡上的浅灰色渐变还表明您可能具有Visual Studio的旧版本。我不认为自从较新的Visual Studio使用纯色以来已经有一段时间了。我建议升级到最新版本。
 
已加入
2011年4月23日
留言内容
177
地点
密歇根州兰辛;美国
编程经验
10+
跳伞和Sheepings,他使用的是VS 2008,只能定位.Net 2.0、3.0和3.5
他需要做的是首先下载VS2019 Community Edition(免费),然后他可以在其中打开他的项目并将其更改为目标.Net 4.8
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
单独使用VS2019无法解决问题。您仍然需要构建针对.NET Framework 4.8的代码。 VS2019的作用是让您选择那个目标。

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

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