Skip to content

Commit 16aa6e0

Browse files
committed
Fixes System.InvalidOperationException: This JsonSerializerOptions instance is read-only or has already been used in serialization or deserialization (#480)
* Updated NuGet packages * Attempt to fix publish * Removed static JSON serializer options instance
1 parent e8fedf6 commit 16aa6e0

File tree

15 files changed

+27
-32
lines changed

15 files changed

+27
-32
lines changed

samples/star-wars-api/Startup.fs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@ type Startup private () =
1515

1616
let rootFactory (ctx) : Root = Root (ctx)
1717

18+
/// Added for testing purposes because in .NET 8 JsonSerializerOptions become frozen after the first use
19+
/// and using this function caused an exception.
20+
let configure (options : GraphQLOptions<_>) =
21+
options.SerializerOptions.Converters.Add (new System.Text.Json.Serialization.JsonStringEnumConverter ())
22+
options
23+
1824
new (configuration : IConfiguration) as this =
1925
Startup ()
2026
then this.Configuration <- configuration
2127

2228
member _.ConfigureServices (services : IServiceCollection) =
2329
services
2430
.AddGiraffe()
25-
.AddGraphQLOptions<Root> (Schema.executor, rootFactory)
31+
.AddGraphQLOptions<Root> (Schema.executor, rootFactory, configure = configure)
2632
|> ignore
2733

2834
member _.Configure

src/FSharp.Data.GraphQL.Server.AspNetCore/Serialization/JSON.fs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,3 @@ let getWSSerializerOptions (additionalConverters: JsonConverter seq) =
4949
options |> configureDefaultWSSerializerOptions additionalConverters
5050
options
5151

52-
let serializerOptions = getWSSerializerOptions Seq.empty

src/FSharp.Data.GraphQL.Server.AspNetCore/StartupExtensions.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module ServiceCollectionExtensions =
1616
SchemaExecutor = executor
1717
RootFactory = rootFactory
1818
ReadBufferSize = GraphQLOptionsDefaults.ReadBufferSize
19-
SerializerOptions = Json.serializerOptions
19+
SerializerOptions = Json.getWSSerializerOptions Seq.empty
2020
WebsocketOptions = {
2121
EndpointUrl = endpointUrl
2222
ConnectionInitTimeout = TimeSpan.FromMilliseconds (GraphQLOptionsDefaults.WebSocketConnectionInitTimeoutInMs)

tests/FSharp.Data.GraphQL.Tests/AspNetCore/InvalidMessageTests.fs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ open FSharp.Data.GraphQL.Server.AspNetCore
66
open FSharp.Data.GraphQL.Server.AspNetCore.WebSockets
77

88
let toClientMessage (theInput : string) =
9-
let serializerOptions = Json.serializerOptions
109
JsonSerializer.Deserialize<ClientMessage> (theInput, serializerOptions)
1110

1211
let willResultInInvalidMessage expectedExplanation input =

tests/FSharp.Data.GraphQL.Tests/AspNetCore/SerializationTests.fs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ open FSharp.Data.GraphQL.Server.AspNetCore
77
open FSharp.Data.GraphQL.Server.AspNetCore.WebSockets
88
open System.Text.Json.Serialization
99

10-
let serializerOptions = Json.serializerOptions
11-
1210
[<Fact>]
1311
let ``Deserializes ConnectionInit correctly`` () =
1412

tests/FSharp.Data.GraphQL.Tests/ExecutionTests.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ open FSharp.Data.GraphQL
1616
open FSharp.Data.GraphQL.Types
1717
open FSharp.Data.GraphQL.Parser
1818
open FSharp.Data.GraphQL.Execution
19-
open FSharp.Data.GraphQL.Server.AspNetCore
2019

2120
type TestSubject = {
2221
a: string
@@ -131,7 +130,7 @@ let ``Execution handles basic tasks: executes arbitrary code`` () =
131130

132131
let schema = Schema(DataType)
133132
let schemaProcessor = Executor(schema)
134-
let params' = JsonDocument.Parse("""{"size":100}""").RootElement.Deserialize<ImmutableDictionary<string, JsonElement>>(Json.serializerOptions)
133+
let params' = JsonDocument.Parse("""{"size":100}""").RootElement.Deserialize<ImmutableDictionary<string, JsonElement>>(serializerOptions)
135134
let result = sync <| schemaProcessor.AsyncExecute(ast, data, variables = params', operationName = "Example")
136135
ensureDirect result <| fun data errors ->
137136
empty errors

tests/FSharp.Data.GraphQL.Tests/Helpers.fs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ open System.Threading
1111
open System.Threading.Tasks
1212
open Xunit
1313
open FSharp.Data.GraphQL
14+
open FSharp.Data.GraphQL.Server.AspNetCore
15+
16+
let serializerOptions = Json.getWSSerializerOptions Seq.empty
1417

1518
let isType<'a> actual = Assert.IsAssignableFrom<'a>(actual)
1619
let isSeq<'a> actual = isType<'a seq> actual
@@ -74,11 +77,10 @@ let greaterThanOrEqual expected actual =
7477

7578
open System.Text.Json
7679
open FSharp.Data.GraphQL.Types
77-
open FSharp.Data.GraphQL.Server.AspNetCore
7880

7981
let stringifyArg name (ctx : ResolveFieldContext) () =
8082
let arg = ctx.TryArg name |> Option.toObj
81-
JsonSerializer.Serialize (arg, Json.serializerOptions)
83+
JsonSerializer.Serialize (arg, serializerOptions)
8284

8385
let stringifyInput = stringifyArg "input"
8486

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputComplexTests.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ open FSharp.Data.GraphQL.Ast
1616
open FSharp.Data.GraphQL.Types
1717
open FSharp.Data.GraphQL.Parser
1818
open FSharp.Data.GraphQL.Execution
19-
open FSharp.Data.GraphQL.Server.AspNetCore
2019
open ErrorHelpers
2120

2221
let TestComplexScalar =
@@ -113,7 +112,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}"""
113112
let paramsWithValueInput input =
114113
JsonDocument
115114
.Parse(variablesWithInput "input" input)
116-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
115+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
117116

118117
let testInputObject =
119118
"""{"mand":"baz","opt1":"foo","opt2":null,"optSeq":["bar"],"voptSeq":["bar"],"optArr":null,"voptArr":null}"""

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputEnumTests.fs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@ open FSharp.Data.GraphQL
1414
open FSharp.Data.GraphQL.Types
1515
open FSharp.Data.GraphQL.Parser
1616
open FSharp.Data.GraphQL.Execution
17-
open FSharp.Data.GraphQL.Server.AspNetCore
1817

1918
let stringifyArg name (ctx : ResolveFieldContext) () =
2019
let arg = ctx.TryArg name |> Option.toObj
21-
JsonSerializer.Serialize (arg, Json.serializerOptions)
20+
JsonSerializer.Serialize (arg, serializerOptions)
2221

2322
let stringifyInput = stringifyArg "input"
2423

@@ -45,7 +44,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}"""
4544
let paramsWithEnumInput input =
4645
JsonDocument
4746
.Parse(variablesWithInput "enumVar" input)
48-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
47+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
4948

5049
[<Fact>]
5150
let ``Execute handles enum input as variable`` () =

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputListTests.fs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ open FSharp.Data.GraphQL
1414
open FSharp.Data.GraphQL.Types
1515
open FSharp.Data.GraphQL.Parser
1616
open FSharp.Data.GraphQL.Execution
17-
open FSharp.Data.GraphQL.Server.AspNetCore
1817
open ErrorHelpers
1918

2019
let stringifyArg name (ctx : ResolveFieldContext) () =
2120
let arg = ctx.TryArg name |> Option.toObj
22-
JsonSerializer.Serialize (arg, Json.serializerOptions)
21+
JsonSerializer.Serialize (arg, serializerOptions)
2322

2423
let stringifyInput = stringifyArg "input"
2524

@@ -41,7 +40,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}"""
4140
let paramsWithValueInput input =
4241
JsonDocument
4342
.Parse(variablesWithInput "input" input)
44-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
43+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
4544

4645
[<Fact>]
4746
let ``Execute handles list inputs and nullability and allows lists to be null`` () =

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNestedTests.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ open FSharp.Data.GraphQL
1313
open FSharp.Data.GraphQL.Types
1414
open FSharp.Data.GraphQL.Parser
1515
open FSharp.Data.GraphQL.Execution
16-
open FSharp.Data.GraphQL.Server.AspNetCore
1716

1817
let InputArrayOf (innerDef : #TypeDef<'Val>) : ListOfDef<'Val, 'Val array> = ListOf innerDef
1918

@@ -60,7 +59,7 @@ let rec TestRecursiveInputObject =
6059

6160
let stringifyArg name (ctx : ResolveFieldContext) () =
6261
let arg = ctx.TryArg name |> Option.toObj
63-
JsonSerializer.Serialize (arg, Json.serializerOptions)
62+
JsonSerializer.Serialize (arg, serializerOptions)
6463

6564
let stringifyInput = stringifyArg "input"
6665

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputNullableStringTests.fs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ open FSharp.Data.GraphQL
1414
open FSharp.Data.GraphQL.Types
1515
open FSharp.Data.GraphQL.Parser
1616
open FSharp.Data.GraphQL.Execution
17-
open FSharp.Data.GraphQL.Server.AspNetCore
1817
open ErrorHelpers
1918

2019
let stringifyArg name (ctx : ResolveFieldContext) () =
2120
let arg = ctx.TryArg name |> Option.toObj
22-
JsonSerializer.Serialize (arg, Json.serializerOptions)
21+
JsonSerializer.Serialize (arg, serializerOptions)
2322

2423
let stringifyInput = stringifyArg "input"
2524

@@ -46,7 +45,7 @@ let variablesWithInput inputName input = $"""{{"%s{inputName}":%s{input}}}"""
4645
let paramsWithValueInput input =
4746
JsonDocument
4847
.Parse(variablesWithInput "input" input)
49-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
48+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
5049

5150
[<Fact>]
5251
let ``Execute handles variables and allows nullable inputs to be omitted`` () =
@@ -99,7 +98,7 @@ let ``Execute handles variables and allows nullable inputs to be set to a value
9998
let paramsWithValueInput input =
10099
JsonDocument
101100
.Parse(variablesWithInput "value" input)
102-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
101+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
103102

104103
let testInputValue = "\"a\""
105104
let params' = paramsWithValueInput testInputValue
@@ -130,7 +129,7 @@ let ``Execute handles non-nullable scalars and does not allow non-nullable input
130129
let paramsWithValueInput input =
131130
JsonDocument
132131
.Parse(variablesWithInput "value" input)
133-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
132+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
134133

135134
let testInputValue = "null"
136135
let params' = paramsWithValueInput testInputValue
@@ -149,7 +148,7 @@ let ``Execute handles non-nullable scalars and allows non-nullable inputs to be
149148
let paramsWithValueInput input =
150149
JsonDocument
151150
.Parse(variablesWithInput "value" input)
152-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
151+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
153152

154153
let testInputValue = "\"a\""
155154
let params' = paramsWithValueInput testInputValue
@@ -181,7 +180,7 @@ let ``Execute uses argument default value when no argument was provided`` () =
181180
let paramsWithOptionalInput input =
182181
JsonDocument
183182
.Parse(variablesWithInput "optional" input)
184-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
183+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
185184

186185
[<Fact>]
187186
let ``Execute uses argument default value when nullable variable provided`` () =

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputObjectValidatorTests.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ open FSharp.Data.GraphQL.Parser
1515
open FSharp.Data.GraphQL.Execution
1616
open FSharp.Data.GraphQL.Validation
1717
open FSharp.Data.GraphQL.Validation.ValidationResult
18-
open FSharp.Data.GraphQL.Server.AspNetCore
1918
open ErrorHelpers
2019

2120
type InputRecord = { Country : string; ZipCode : string; City : string }
@@ -158,7 +157,7 @@ let variablesWithAllInputs (record, record1, record2, record3) =
158157
let paramsWithValues variables =
159158
JsonDocument
160159
.Parse(variables : string)
161-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
160+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
162161

163162
[<Fact>]
164163
let ``Execute handles validation of valid input records from variables with all fields`` () =

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/InputRecordTests.fs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ open System.Text.Json
1111
open FSharp.Data.GraphQL
1212
open FSharp.Data.GraphQL.Types
1313
open FSharp.Data.GraphQL.Parser
14-
open FSharp.Data.GraphQL.Server.AspNetCore
1514

1615
type InputRecord = { a : string; b : string; c : string }
1716

@@ -143,7 +142,7 @@ let variablesWithAllInputs (record, optRecord) =
143142
let paramsWithValues variables =
144143
JsonDocument
145144
.Parse(variables : string)
146-
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (Json.serializerOptions)
145+
.RootElement.Deserialize<ImmutableDictionary<string, JsonElement>> (serializerOptions)
147146

148147
[<Fact>]
149148
let ``Execute handles creation of input records from variables with all fields`` () =

tests/FSharp.Data.GraphQL.Tests/Variables and Inputs/OptionalsNormalizationTests.fs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ open System.Text.Json
1313
open FSharp.Data.GraphQL
1414
open FSharp.Data.GraphQL.Types
1515
open FSharp.Data.GraphQL.Parser
16-
open FSharp.Data.GraphQL.Server.AspNetCore
1716

1817
module Phantom =
1918

0 commit comments

Comments
 (0)