如何将JSON请求体绑定到Nancy中的字符串原始变量?

时间:2017-09-28 10:52:58

标签: c# json nancy

我有以下Nancy模块。

public class MyFooTestModule : NancyModule
{
    public MyFooTestModule()
    {
        Post["/text"] = _ =>
        {
            //string myNewText = this.Bind<string>(); // Fails, because string has no parameterless constructor
            string myNewText = Request.Body.AsString();

            return Response.AsJson(myNewText);
        };
    }
}

我希望绑定到单个string变量。但是,我不能使用this.Bind<string>(),例如使用this.Bind<int>(),因为在运行时我得到一个异常告诉我:

System.MissingMethodException: No parameterless constructor defined for this object.

如果我使用Request.Body.AsString()代替,则字符转义无法正常工作,我最终会在我的变量中使用多个引号并转义反斜杠。

更准确地说,当我发布JavaScript字符串

"Hello\r\nWorld Foo!"

从客户端,我收到echo JavaScript字符串

"\"Hello\\r\\nWorld Foo!\""

来自服务器。

将JSON请求主体绑定到原始string变量的正确原因是什么?我不想将每个原始类型包装到一个无用的容器类中,只是为了交换我的JavaScript客户端中使用的string变量。

1 个答案:

答案 0 :(得分:0)

这很可能是C#设计决策的结果,再加上框架内序列化的常见做法。字符串类型是不可变的 - 一旦创建实例就无法更改。序列化的常用方法尝试创建所需类型的实例并分配其成员值。 另一种方法是将值作为参数传递

Post["/text/{userString:string}"] = parameter => 
{ 
  // access the value herewith something like
  string theString = parameter.userString 
}

在我的脑海中,大多数其他原语都可以工作,只有字符串是不可变的,尽管有几种内置类型不会起作用,例如元组和日期时间。