2016-07-02 3 views
6

私はsuaveのチュートリアルに従っています。私はJSONをフロントエンドに返すのに苦労しています。私は現在コードを持っています。 (私はChironパッケージを使用していません)。私はウェブサーバをうまく起動できますが、localhost:8083/helloに行くと、以下のエラーメッセージが表示されます。私はこれをデバッグする方法、またはこれを引き起こす原因についてはわかりません。派生クラス System.Reflection.Module.GetCustomAttributes(システムでそれを実装する必要があります。SuaveのFを使用してJSONを返すことができません#

Hereは、それを実装する必要があります

System.NotImplementedExceptionは私が

#r "../packages/Suave/lib/net40/Suave.dll" 
#r "System.Runtime.Serialization.dll" 
#r "../packages/FParsec/lib/net40-client/FParsecCS.dll" 
#r "../packages/Aether/lib/net35/Aether.dll" 
#r "../packages/Chiron/lib/net40/Chiron.dll" 
module Test = 

    open Suave     // always open suave 
    open Suave.Successful  // for OK-result 
    open Suave.Web    // for config 
    open Suave.Operators 
    open Suave.Http 
    open Suave.Filters 
    open Suave.Json 
    open System.Runtime.Serialization 
    open Suave.Writers 

    [<DataContract>] 
    type Foo = 
     { 
     [<field: DataMember(Name = "foo")>] 
     foo : string; 
     } 

    [<DataContract>] 
    type Bar = 
     { 
     [<field: DataMember(Name = "bar")>] 
     bar : string; 
     } 

    let router = 
     choose 
      [path "/hello" >=> (mapJson (fun (a:Foo) -> { bar = a.foo })) >=> setMimeType "application/json; charset=utf-8"; 
      path "/bye" >=> OK "GOOD WHAT"] 

    startWebServer defaultConfig router 

派生クラスを以下のよチュートリアルです。 attributeType、Boolean継承)< 0x104618170 + 0x00010>:0の場合 System.Reflection.Emit.ModuleBuilder.GetCustomAttributes(System.Type とattributeType、ブール継承)< 0x1045f1800 + 0x0001b>:0 System.Runtime.Serialization.DataContract.GetGlobalDataContractNamespace(可能System.String clrNs、ICustomAttributeProvider customAttribuetProvider)< 0x10da40f60 + 0x00045>であり: System.Runtimeで0。 Serialization.DataContract.GetDefaultDataContractNamespace (のSystem.Type型)< 0x10da40e80 + 0x00051>:0 でSystem.Runtime.Serialization.DataContract.GetDCTypeStableName(のSystem.Type型、System.Runtime.Serialization.DataContractAttribute dataContractAttribute)< 0x10da3fd50 + 0x000f5> in:0 at System.Runtime.Serialization.Data Contract.GetStableName(System.Typeを タイプ、System.Collections.Generic.Dictionary 2 previousCollectionTypes, System.Boolean& hasDataContract) <0x10da3f570 + 0x00092> in :0 at System.Runtime.Serialization.DataContract.GetStableName (System.Type type, System.Boolean& hasDataContract) <0x10da3f4f0 + 0x00058> in :0 at System.Runtime.Serialization.ClassDataContract+ClassDataContractCriticalHelper.GetStableNameAndSetHasDataContract (System.Type type) <0x10da3f490 + 0x00031> in :0 at System.Runtime.Serialization.ClassDataContract+ClassDataContractCriticalHelper..ctor (System.Type type) <0x10da3e1e0 + 0x00044> in :0 at System.Runtime.Serialization.ClassDataContract..ctor (System.Type type) <0x10da3e120 + 0x00045> in :0 at System.Runtime.Serialization.DataContract+DataContractCriticalHelper.CreateDataContract (Int32 id, RuntimeTypeHandle typeHandle, System.Type type) <0x10da3ab00 + 0x0031e> in :0 at System.Runtime.Serialization.DataContract+DataContractCriticalHelper.GetDataContractSkipValidation (Int32 id, RuntimeTypeHandle typeHandle, System.Type type) <0x10da3aa50 + 0x0005c> in :0 at System.Runtime.Serialization.DataContract.GetDataContractSkipValidation (Int32 id, RuntimeTypeHandle typeHandle, System.Type type) <0x10da3aa10 + 0x00023> in :0 at System.Runtime.Serialization.DataContract.GetDataContract (Int32 id, RuntimeTypeHandle typeHandle, SerializationMode mode) <0x10da3a9c0 + 0x00025> in :0 at System.Runtime.Serialization.DataContract.GetDataContract (RuntimeTypeHandle typeHandle, System.Type type, SerializationMode mode) <0x10da3a240 + 0x00036> in :0 at System.Runtime.Serialization.DataContract.GetDataContract (System.Type type) <0x10da3a1f0 + 0x0002f> in :0 at System.Runtime.Serialization.Json.DataContractJsonSerializer.get_RootContract () <0x10da3a0f0 + 0x0005b> in :0 at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalIsStartObject (System.Runtime.Serialization.XmlReaderDelegator reader) <0x10da39fa0 + 0x00038> in :0 at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject (System.Runtime.Serialization.XmlReaderDelegator xmlReader, Boolean verifyObjectName) <0x10da39b60 + 0x00046> in :0 at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject (System.Runtime.Serialization.XmlReaderDelegator reader, Boolean verifyObjectName, System.Runtime.Serialization.DataContractResolver dataContractResolver) <0x10da39b30 + 0x00020> in :0 at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (System.Runtime.Serialization.XmlReaderDelegator reader, Boolean verifyObjectName, System.Runtime.Serialization.DataContractResolver dataContractResolver) <0x10da39760 + 0x0020f> in :0 at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (System.Runtime.Serialization.XmlReaderDelegator reader, Boolean verifyObjectName) <0x10da396f0 + 0x00025> in :0 at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject (System.Xml.XmlDictionaryReader reader) <0x10da39480 + 0x0006d> in :0 at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject (System.IO.Stream stream) <0x10da36030 + 0x0005c> in :0 at Suave.Json.fromJson[T] (System.Byte[] bytes) <0x10da35890 + 0x00103> in :0 at [email protected][a,b].Invoke (Suave.HttpRequest r) <0x10da35740 + 0x0004f> in :0 at Microsoft.FSharp.Core.FSharpFunc 2 [T、TResult] .InvokeFast [V] (Microsoft.FSharp.Core.FSharpFunc 2 func, Microsoft.FSharp.Core.T arg1, Microsoft.FSharp.Core.TResult arg2) <0x1052faeb0 + 0x000a1> in :0 at [email protected] (Suave.HttpContext context) <0x10da356f0 + 0x00034> in :0 at [email protected][a,b].Invoke (Microsoft.FSharp.Core.FSharpOption 1 _arg1)< 0x10da331d0 + 0x0004c> で: [email protected] [a、b]は.Invoke(AA)で0 < 0x10d4db780 + 0x000af>:0

+3

あなたのタイプ 'Foo'は名前空間やモジュールにはなく、' DataContractSerializer'はそれを気に入らないようです。モジュールまたは名前空間で全体をラップしてみてください。 –

+0

@FyodorSoikinモジュール全体をラップするように更新しましたが、それでも同じエラーが表示されました:/ –

+1

名前空間を試してみますか? –

答えて

3

そうでない理由を知ってはいけません[<DataContract>]で作業しますが、これは単純に動作します:

#I __SOURCE_DIRECTORY__ 
#r "../../../packages/FSPowerPack.Core.Community/Lib/Net40/FSharp.PowerPack.dll" 
#r "../../../packages/FSPowerPack.Linq.Community/Lib/Net40/FSharp.PowerPack.Linq.dll" 
#r "../../../packages/FSPowerPack.Metadata.Community/Lib/Net40/FSharp.PowerPack.Metadata.dll" 
#r "../../../packages/FSPowerPack.Parallel.Seq.Community/Lib/Net40/FSharp.PowerPack.Parallel.Seq.dll" 
#r "../../../packages/Informedica.GenUnits.lib/lib/net45/Informedica.GenUnits.lib.dll" 
#r "../../../packages/Informedica.GenUtils.Lib/lib/net45/Informedica.GenUtils.Lib.dll" 
#r "../../../packages/Suave/lib/net40/Suave.dll" 
#r "../../../packages/Suave.Testing/lib/net40/Suave.Testing.dll" 
#r "../../../packages/Fuchu/lib/Fuchu.dll" 
#r "System.Core.dll" 
#r "System.dll" 
#r "System.Numerics.dll" 
#r "System.Runtime.Serialization.dll" 
#r "System.Net.Http.dll" 

#time 


//Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 



open System 
open System.IO 
open System.Text 
open System.Net.Http 

open Suave     // always open suave 
open Suave.Successful  // for OK-result 
open Suave.Web    // for config 
open Suave.Operators 
open Suave.Http 
open Suave.Filters 
open Suave.Json 
open System.Runtime.Serialization 
open Suave.Writers 

open Suave.Testing 


//[<DataContract>] 
type Bar = 
    { 
// [<field: DataMember(Name = "bar")>] 
    bar : string; 
    } 


//[<DataContract>] 
//[<CLIMutable>] 
type Foo = 
    { 
// [<field: DataMember(Name = "foo")>] 
    foo : string; 
    } 

let router = 
    choose 
     [ POST >=> path "/hello" >=> (mapJson (fun (a:Foo) -> { Bar.bar = a.foo })) >=> setMimeType "application/json; charset=utf-8"; 
      path "/bye" >=> OK "GOOD WHAT"] 


runWith defaultConfig router 
|> req HttpMethod.POST "/hello" (Some <| new ByteArrayContent(toJson { foo = "foo" })) 

編集:それはさらに悪いです、私はdatacontractシリアル化がモノで壊れていると思います。私はバージョン4.4.1を実行し、Windows上で.netで正常に動作する同じコードを使用すると、エラーが発生します。

関連する問題