为什么我不能在Nancy中注册自定义JSON.Net实现
本文关键字:自定义 JSON Net 实现 注册 不能 Nancy 为什么 | 更新日期: 2023-09-27 18:24:53
我安装了以下内容:
<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>();
}
最后在路线上:
public sealed class ApiBase : NancyModule
{
public ApiBase() : base("api/")
{
Get["user/"] = o => Response.AsJson(new { Context.CurrentUser, Time = DateTime.UtcNow});
}
}
然而,当运行这个应用程序时,CustomJsonNetSerializer
从未被实例化,看起来Nancy使用了一个不同的实现——可能是ISerializer
。
请注意,我想知道为什么这个解决方案失败了,因为我正在遵循官方文档,而不是执行其他实现,即实现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;
这种变化将如预期的那样得到反映:
{
"currentUser": null,
"time": "'/Date(1448809002853)'/"
}
你能确保你的应用程序配置正确吗:
在应用程序的根命名空间中有Startup
类(它是OWIN吗?)。用OwinStartup注释Startup
类。类似于:
[assembly: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>
我遇到了同样的问题,基本上看起来CustomSerializer已经注册,但没有响应。AsJson它没有使用它。我在模块中的构造函数上添加了注册的序列化程序,如果我手动序列化对象并发送AsText响应,它就会工作。问题可能是方法AsJson没有使用自定义序列化程序吗?
所以,在引导程序中,我和你一样
protected override void ConfigureApplicationContainer(Nancy.TinyIoc.TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
container.Register<System.Web.Script.Serialization.JavaScriptSerializer>(CustomJsonSerializer);
}
但是在模块中
public class SimpleModule : Nancy.NancyModule
{
Get["/State/"] = parameters =>
{
string Json = TheSerializer.Serialize(myobject);
return Response.AsText(Json);
// return Response.AsJson(myobject);
};
}
在响应上切换注释将最终得到两个不同的JSON响应。使用AsJson方法时出现错误。