首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用Suave F#返回JSON

无法用Suave F#返回JSON
EN

Stack Overflow用户
提问于 2016-07-02 19:55:49
回答 1查看 836关注 0票数 7

我正在学习有声教程,并且很难将JSON返回到前端。我现在有密码。(我不使用Chiron软件包)。我可以很好地启动web服务器,但是当我转到localhost:8083/hello时,我会收到下面的错误消息。我不知道如何调试这个程序,或者是什么导致了这个问题。

这里是我正在学习的教程

代码语言:javascript
复制
#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

派生类必须实现它。 System.Reflection.Emit.ModuleBuilder.GetCustomAttributes :派生类必须在System.Runtime.Serialization.DataContract.GetGlobalDataContractNamespace (System.String clrNs,ICustomAttributeProvider customAttribuetProvider) <0x10da40f60 + 0x00045>中的<0x1045f 1800+ 0x0001b>中的<0x104618170 + 0x00010>中的<0x104618170+0x00010>中实现它( System.Reflection.Module.GetCustomAttributes (System.Type attributeType,布尔继承))中的<0x104618170+0x00010>中的<0x104618170+0x00010>中的<0x104618170+0x00010>中的<0x104618170+0x00010>中的<0x104618170+0x00010>中的<0x10da40e80 +0x00045>中的<0x10da40e80+0x00045>中的<0x10da40e80+0x00045>中的<0x10da40e80+0x00045>中的<0x10da40e80+0x00045>中的<0x10da40e80+0x00045>中的<0x10da40e80+0x00045>中的<0x10da40e80+0x00045>中System.Runtime.Serialization.DataContractAttribute ) <0x10da3fd50 + 0x000f5> in :0 at System.Runtime.Serialization.DataContract.GetStableName (System.Type类型,System.Collections.Generic.Dictionary2 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 Suave.Json+mapJson@31[a,b].Invoke (Suave.HttpRequest r) <0x10da35740 + 0x0004f> in :0 at Microsoft.FSharp.Core.FSharpFunc2T,TResult.InvokeFastV <0x1052faeb0 + 0x000a1> in :0 at Suave.Json+mapJson@31-2. b.Invoke (Suave.HttpContext context) <0x10da356f0 + 0x00034> in :0 at Suave.WebPart+bind@14-5a,b.Invoke (Microsoft.FSharp.Core.FSharpOption`1 _arg1) <0x10da331d0 + 0x0004c> in :0 at Microsoft.FSharp.Control.AsyncBuilderImpl+args@835-1a,)b.Invoke ( a ) <0x10d4db780 + 0x000af> in :0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-05 10:08:43

不知道为什么它不适用于[<DataContract>],但简单地说,这是可行的:

代码语言:javascript
复制
#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" }))

编辑:更糟的是,我认为数据域序列化被mono打破了。我运行4.4.1版本,如果我使用在windows上运行良好的.net代码,就会得到错误。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38163968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档