gpt4 book ai didi

c# - 为什么我不能在 Nancy 中注册自定义 JSON.Net 实现?

转载 作者:行者123 更新时间:2023-11-30 12:24:31 25 4
gpt4 key购买 nike

我安装了以下内容:

  <package id="Nancy" version="1.4.2" targetFramework="net4" />
<package id="Nancy.Owin" version="1.4.1" targetFramework="net4" />
<package id="Nancy.Serialization.JsonNet" version="1.4.1" targetFramework="net4" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net4" />
<package id="Owin" version="1.0" targetFramework="net4" />

还有:

public sealed class Startup
{
public void Configuration(IAppBuilder app)
{
var options = new NancyOptions();
app.UseNancy(options);
}
}

public sealed class CustomJsonNetSerializer : JsonSerializer
{
public CustomJsonNetSerializer()
{
ContractResolver = new CamelCasePropertyNamesContractResolver();
DateFormatHandling = DateFormatHandling.IsoDateFormat;
Formatting = Formatting.Indented;
}
}

然后在我的 Bootstrapper 中:

protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);

container.Register<JsonSerializer, CustomJsonNetSerializer>();
}

最后在 route :

public sealed class ApiBase : NancyModule
{
public ApiBase() : base("api/")
{
Get["user/"] = o => Response.AsJson(new { Context.CurrentUser, Time = DateTime.UtcNow});
}
}

但是,在运行此应用时,CustomJsonNetSerializer 从未实例化,看起来 Nancy 使用的可能是 ISerializer 的不同实现。

请注意,我想知道为什么这个解决方案失败了,因为我正在关注官方 doc而不是执行其他实现,即实现 ISerializer

有什么想法吗?

[更新]我不知道出了什么问题,所以我得到了:

public sealed class CustomJsonNetSerializer : JsonSerializer, ISerializer
{
public CustomJsonNetSerializer()
{
ContractResolver = new CamelCasePropertyNamesContractResolver();
DateFormatHandling = DateFormatHandling.IsoDateFormat;
Formatting = Formatting.None;
}

public bool CanSerialize(string contentType)
{
return contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase);
}

public void Serialize<TModel>(string contentType, TModel model, Stream outputStream)
{
using (var streamWriter = new StreamWriter(outputStream))
using(var jsonWriter = new JsonTextWriter(streamWriter))
{
Serialize(jsonWriter, model);
}
}

public IEnumerable<string> Extensions { get { yield return "json"; } }
}

和:

protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);

container.Register<ISerializer, CustomJsonNetSerializer>();
}

最佳答案

为什么你认为你的自定义序列化器没有被使用?

我可以看到为 CustomJsonNetSerializer 设置的断点已命中。

响应包含格式正确的 JSON 文件:

{
"currentUser": null,
"time": "2015-11-29T15:01:55.4669533Z"
}

如果我更改DateFormatHandling

DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;

更改将按预期反射(reflect):

{
"currentUser": null,
"time": "\/Date(1448809002853)\/"
}

您能否确保您的应用程序配置正确:

您的应用程序的根命名空间中有 Startup 类(是 OWIN 吗?)。使用 OwinStartup 注释注释 Startup 类。像这样的东西:

[程序集:OwinStartup(typeof(WebApplication3.Startup))]

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseNancy();
}
}

你只有一个Bootstrapper

public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);

container.Register<JsonSerializer, CustomJsonNetSerializer>();
}
}

验证所有包的版本:

<packages>
<package id="Microsoft.Owin" version="2.1.0" targetFramework="net4" />
<package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net4" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net4" />
<package id="Nancy" version="1.4.2" targetFramework="net4" />
<package id="Nancy.Owin" version="1.4.1" targetFramework="net4" />
<package id="Nancy.Serialization.JsonNet" version="1.4.1" targetFramework="net4" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net4" />
<package id="Owin" version="1.0" targetFramework="net4" />
</packages>

关于c# - 为什么我不能在 Nancy 中注册自定义 JSON.Net 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33983600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com