南希(c#):我如何得到我的帖子数据?

本文关键字:我的 数据 何得 南希 | 更新日期: 2023-09-27 18:15:11

我使用Corona SDK将数据发布到我的c#服务器:

headers["Content-Type"] = "application/x-www-form-urlencoded"
headers["Accept-Language"] = "en-US"
local body = "color=red&size=small"
local params = {}
params.headers = headers
params.body = body
network.request( host .. "/UpdateHand", "POST", nwListener, params )

我在服务器上收到一条消息:

  Post["/UpdateHand"] = x =>
        {
            Console.WriteLine("Received ...");
            return "Ok";
        };

但是当我检查数据(当我把断点在它)我不知道我的数据是加载(即参数。Body或params.headers)。我如何提取这些信息?

我应该根据Corona上的文档正确地发布它:http://docs.coronalabs.com/daily/api/library/network/request.html

南希(c#):我如何得到我的帖子数据?

post数据在

this.Request.Body

如果你有合适的类型,你可以使用模型绑定将你的数据反序列化到它:

var x = this.Bind<YourType>();

有一个Nancy扩展。您需要为它包含名称空间。

using Nancy.Extensions;
var text =  Context.Request.Body.AsString();

我喜欢这种简洁的方式,这是南希超级简单的方式的一部分。

但是要注意!此方法将流留在最后,因此后续调用将返回空字符串。要解决这个问题,总是在之后立即重置流,如下所示:

Request.Body.Seek(0, SeekOrigin.Begin);

Nancy 2.0应该会纠正这个错误,以便默认情况下重置流位置。

https://github.com/NancyFx/Nancy/pull/2158

这实际上很有效:

var body = this.Request.Body; 
int length = (int) body.Length; // this is a dynamic variable
byte[] data = new byte[length]; 
body.Read(data, 0, length);             
Console.WriteLine(System.Text.Encoding.Default.GetString(data));

对于Nancy 2.0.0, Request.BodyStream而不是RequestStream,因此没有AsString方法。然而,这似乎是有效的:

using (var reqStream = RequestStream.FromStream(Request.Body))
{
    var body = reqStream.AsString();
    // ... do stuff with body
}

理想情况下,可以通过简单的Bind()调用来获取您的post数据。然而,当在post调用中使用Bind时,我看到了不一致的结果,因此我不得不使用上面概述的方案。

我看到了各种关于Nancy Bind()工作和不工作的讨论…我和Post都见过,但无法解释这种不一致。我看到它正常工作的地方是我可以保证请求体按如下方式管理的地方:

        var data = Encoding.ASCII.GetBytes (postData);
        request.Method = "POST";
        request.ContentType = "application/json";
        request.ContentLength = data.Length;
        using (var stream = request.GetRequestStream ()) {
            stream.Write (data, 0, data.Length);
        }

然而,当通过WSO2基础设施(数据序列化为JSON事件字典发送给服务代理)发送应该类似处理的数据时,Bind失败,而上面的方法成功。