【问题标题】:Receiving POST data in ASP.NET在 ASP.NET 中接收 POST 数据
【发布时间】:2011-02-13 23:18:47
【问题描述】:

我想使用 ASP 在 C# 桌面应用程序中生成代码。

为了实现这一点,我设置了一个简单的主机(派生自 System.MarshalByRefObject),它通过 HttpRuntime.ProcessRequest 处理 System.Web.Hosting.SimpleWorkerRequest。这会处理传入请求指定的 ASPX 脚本(使用 System.Net.HttpListener 等待请求)。

客户端部分由 System.ComponentModel.BackgroundWorker 表示,它构建 System.Net.HttpWebRequest 并接收来自服务器的响应。

我的客户端部分代码的简化版本如下所示:

私人无效发送请求(对象发送者,DoWorkEventArgs e) { // 使用 GET 参数创建请求 var uri = "http://localhost:9876/test.aspx?getTest=321"; var request = (HttpWebRequest)WebRequest.Create(uri); // 附加 POST 参数 request.Method = "POST"; request.ContentType = "应用程序/x-www-form-urlencoded"; var postData = Encoding.Default.GetBytes("postTest=654"); var postDataStream = request.GetRequestStream(); postDataStream.Write(postData, 0, postData.Length); // 发送请求,等待响应并存储/打印内容 使用 (var response = (HttpWebResponse)request.GetResponse()) { 使用 (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { _processsedContent = reader.ReadToEnd(); Debug.Print(_processsedContent); } } }

我的服务器部分代码如下所示(没有异常处理等):

公共无效进程请求() { // http://localhost:9876/ 的 HttpListener var listener = SetupListener(); // 由 ApplicationHost.CreateApplicationHost 创建的 SimpleHost var host = SetupHost(); 在跑步的时候) { var context = listener.GetContext(); 使用 (var writer = new StreamWriter(context.Response.OutputStream)) { // 处理 ASP 脚本并将响应发送回客户端 host.ProcessRequest(GetPage(context), GetQuery(context), writer); } context.Response.Close(); } }

到目前为止,只要我只使用 GET 参数,所有这些都可以正常工作。但是在我的 ASPX 脚本中接收 POST 数据时,我遇到了麻烦。对于测试,我使用以下脚本:

// GET 参数有效: var getTest = Request.QueryString["getTest"]; Response.Write("getTest:" + getTest); // 打印“getTest: 321” // 不知道如何访问 POST 参数: var postTest1 = Request.Form["postTest"]; // Request.Form 是空的?! Response.Write("postTest1:" + postTest1); // 所以这会打印“postTest1:” var postTest2 = Request.Params["postTest"]; // Request.Params 是空的?! Response.Write("postTest2:" + postTest2); // 所以这会打印“postTest2:”

似乎我在 ASP 中处理的 System.Web.HttpRequest 对象不包含有关我的 POST 参数“postTest”的任何信息。我在调试模式下检查了它,没有一个成员既不包含参数名称“postTest”也不包含参数值“654”。我也试过Request的BinaryRead方法,可惜是空的。这对应于 Request.InputStream==null 和 Request.ContentLength==0。为了让事情真正令人困惑,Request.HttpMethod 成员设置为“GET”?!

为了隔离问题,我使用 PHP 脚本而不是 ASPX 脚本测试了代码。这很简单:

print_r($_GET); // 打印所有 GET 变量 print_r($_POST); // 打印所有 POST 变量

结果是:

大批 ( [getTest] => 321 ) 大批 ( [后测试] => 654 )

所以使用它工作的 PHP 脚本,我可以访问 POST 数据。为什么 ASPX 脚本没有? 我做错了什么? Response 对象中是否有特殊的访问器或方法?

任何人都可以给出提示甚至知道如何解决这个问题吗?提前致谢。

【问题讨论】:

  • 您是否尝试过仅使用 Request["postTest"]?有可能只是因为它是一个帖子,它可能没有被加载到 Request.Form 中。

标签: .net post httpwebrequest asp.net httprequest


【解决方案1】:

这可能是导致您的请求流被丢弃的编码问题。你应该使用:

UTF8Encoding.UTF8.GetBytes("postTest=654");

因为您可能会使用“Windows-1252”代码页发送请求。

【讨论】:

    【解决方案2】:

    从 Web.config 中删除 cookieless="true"

    【讨论】:

      【解决方案3】:

      今天我遇到了类似的问题。在我的配置中,它是由 URL-REWRITING 规则引起的。该规则将所有页面从 HTTP 重定向到 HTTPS,并且在重定向时,POST 数据丢失。 所以对我来说,将数据发布到 HTTPS 而不是 HTTP 会有所帮助(因为当时该规则不适用)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-21
        • 2019-04-22
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        相关资源
        最近更新 更多