我有一个Nancy.SelfHost服务,它在Get路由上运行得很好,但是在Post路由上失败了。如果Bind()命令在以下路由上失败,则出现“未为此对象定义无参数构造函数”错误:
Post["/schedule"] = _ =>
{
var schedule = this.Bind<OatiDay[]>();
PostSchedule(schedule);
return HttpStatusCode.Created;
}; 下面是错误返回的调用堆栈:
Nancy.RequestExecutionException: Oh noes! ---> System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at Nancy.Serialization.JsonNet.JsonNetBodyDeserializer.CreateObjectWithBlacklistExcluded(BindingContext context, Object deserializedObject)
at Nancy.Serialization.JsonNet.JsonNetBodyDeserializer.Deserialize(String contentType, Stream bodyStream, BindingContext context)
at Nancy.ModelBinding.DefaultBinder.DeserializeRequestBody(BindingContext context)
at Nancy.ModelBinding.DefaultBinder.Bind(NancyContext context, Type modelType, Object instance, BindingConfig configuration, String[] blackList)
at Nancy.ModelBinding.DynamicModelBinderAdapter.TryConvert(ConvertBinder binder, Object& result)
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at Nancy.ModelBinding.ModuleExtensions.Bind[TModel](INancyModule module)
at TSID.Scada.Nancy.ScheduleService.<.ctor>b__2(Object _) in p:\TSIDDev\TSID.Scada\TSID.Scada.Nancy\ScheduleService.cs:line 24
at CallSite.Target(Closure , CallSite , Func`2 , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at Nancy.Routing.Route.<>c__DisplayClass4.<Wrap>b__3(Object parameters, CancellationToken context)
--- End of inner exception stack trace ---
at Nancy.NancyEngine.InvokeOnErrorHook(NancyContext context, ErrorPipeline pipeline, Exception ex)反序列化器看起来好像出了问题,但我不知道正在创建什么。邮政编码正在使用Nancy通过服务器上的所有测试,所以请求一定有问题。但我搞不懂是什么。OatiDay类只是一个poco对象。
public class OatiDay
{
[BsonId]
public string Id { get; set; }
[BsonDateTimeOptions(DateOnly = true, Kind = DateTimeKind.Local)]
public DateTime Date { get; set; }
public String Facility { get; set; }
public Production OnPeak { get; set; }
public Production OffPeak { get; set; }
public class Production
{
public Int32 ScheduleForDay { get; set; }
public double? ActualForDay { get; set; }
public Int32 ScheduledToDate { get; set; }
public double? ActualToDate { get; set; }
}
}以下是从角$http服务发送的请求:
POST http://buckhorn1:7000/schedule HTTP/1.1
Host: buckhorn1:7000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Referer: http://buckhorn1:7203/schedule
Content-Length: 793
Origin: http://buckhorn1:7203
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
[{"id":"20150712","date":"2015-07-12T00:00:00Z","facility":"Watson","onPeak":{"scheduleForDay":0,"actualForDay":6.56,"scheduledToDate":77,"actualToDate":92.61},"offPeak":{"scheduleForDay":12,"actualForDay":4.26,"scheduledToDate":71,"actualToDate":64.97},"hasPeak":false},{"id":"20150713","date":"2015-07-13T00:00:00Z","facility":"Watson","onPeak":{"scheduleForDay":8,"actualForDay":8,"scheduledToDate":85,"actualToDate":100.61},"offPeak":{"scheduleForDay":4,"actualForDay":4,"scheduledToDate":75,"actualToDate":68.97},"hasPeak":true},{"id":"","date":"2015-07-14T00:00:00.000Z","facility":"Watson","hasPeak":true,"onPeak":{"scheduleForDay":9,"scheduledToDate":94,"actualForDay":9,"actualToDate":109.61},"offPeak":{"scheduleForDay":5,"scheduledToDate":80,"actualForDay":5,"actualToDate":73.97}}]有人能告诉我如何解决这个问题吗?
发布于 2015-07-22 20:46:08
我无法让南希模型的装订开始工作。我怀疑这与骆驼外壳的反序列化有关。我换了这个:
var schedule = this.Bind<OatiDay[]>();在这方面:
var reader = new StreamReader(this.Request.Body);
string text = reader.ReadToEnd();
var schedule = JsonConvert.DeserializeObject<OatiDay[]>(text);我的服务起作用了。
发布于 2017-08-31 04:14:52
也有同样的问题。这实际上是Newtonsoft.Json问题。
其中之一可以帮助:
1)将OatiDay[]改为List。这其实是我的解决方案。
2)如果可能的话,添加带有属性的包装类{ OatiDay[] OatiDays { get; set; } }
3)直接Json.Net反序列化(pthalacker )
4)实现自定义模型绑定器Nancy.ModelBinding.IModelBinder。
https://stackoverflow.com/questions/31484489
复制相似问题