.net - 在 ASP.NET 中接收 POST 数据

标签 .net post httpwebrequest asp.net httprequest

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

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

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

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

私有(private)无效发送请求(对象发送者,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);
}
}
}

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

公共(public)无效进程请求()
{
//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”的任何信息。我在 Debug模式下检查了它,没有一个成员既不包含参数名称“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 对象中是否有特殊的访问器或方法?

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

最佳答案

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

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

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

关于.net - 在 ASP.NET 中接收 POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740141/

相关文章:

c# - .NETCore HttpWebRequest - 旧方法不起作用

.net - 如何控制触发事件处理程序的顺序?

c# - Silverlight - 控件模板中的动画元素

c# - 为什么我的控制台应用程序有命令历史记录?

c++ - Qt等待POST完成

http - 如何使用 golang http 客户端在 url 中正确设置路径参数?

ruby-on-rails - 更新方法 "No route matches [POST]"

.net - RequestCacheLevel.BypassCache 内部是什么?

c# - HttpWebRequest 仅在 Internet Explorer 中为 302 返回 404

.net - "PublicKeyToken <..> is not a valid extension type."错误?