【问题标题】:Nancy (C#): How do I get my post data?Nancy (C#):我如何获取我的帖子数据?
【发布时间】:2014-09-18 03:39: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";
        };

但是当我检查数据时(当我在其上放置断点时),我看不到我的数据位于何处(即 params.body 或 params.headers)。如何提取这些信息?

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

【问题讨论】:

标签: c# lua coronasdk nancy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为此有一个 Nancy 扩展。您需要为其添加命名空间。

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

    我喜欢它的简洁性,这是 Nancy 的超级简单路径的一部分。

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

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

    Nancy 2.0 应该纠正这个问题,以便默认重置流位置。

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

    【讨论】:

    • 使用 Nancy 2.0.0 - 但 Context.Request.BodySystem.IO.Stream - 所以没有可用的 AsString :(
    • Ian - 它应该在 Nancy.Extensions 中。
    【解决方案3】:

    理想情况下,可以通过简单的 Bind() 调用来获取您的帖子数据。但是,我在 post call 中使用 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 失败,而上述方法成功。

    【讨论】:

      【解决方案4】:

      这实际上效果很好:

      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));
      

      【讨论】:

        【解决方案5】:

        帖子数据在

        this.Request.Body
        

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

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

        【讨论】:

        • 谢谢,我暂时没有合适的类型,所以我做了第一个。我的输出是,当我执行 var b = this.Request.Body 时,是“Nancy.IO.RequestStream”。那不应该在发送时接收正文吗?
        • 好的,所以这似乎给出了一些期望的输出: var id = this.Request.Body;字节[]数据=新字节[10]; id.Read(数据, 0, 5); Console.WriteLine(System.Text.Encoding.Default.GetString(data));
        • 如果内存服务,RequestStream 有一个 AsString 扩展方法,所以你可以通过 this.Request.Body.AsString() 获取正文作为字符串
        • @ChristianHorsdal 位于 Nancy.Extensions 命名空间中
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多