@@ -99,37 +99,6 @@ protected virtual JsonSerializer CreateJsonSerializer()
9999 return _serializer ;
100100 }
101101
102- /// <summary>
103- /// Gets a list of partial response fields for the current request.
104- /// </summary>
105- /// <param name="request">The request.</param>
106- /// <returns>A <see cref="System.Collections.ObjectModel.Collection{string}"/> that contains the specified fields for the
107- /// current request, or null if all fields should by serialized.</returns>
108- protected virtual Fields GetPartialResponseFields ( HttpRequest request )
109- {
110- if ( request == null )
111- {
112- throw new ArgumentNullException ( "request" ) ;
113- }
114-
115- var queryOption = request . Query [ "fields" ] . FirstOrDefault ( ) ;
116-
117- if ( queryOption != null )
118- {
119- Fields fields ;
120-
121- if ( ! Fields . TryParse ( queryOption , out fields ) )
122- {
123- // TODO: No more HttpResponseException in ASP.NET Core.
124- throw new Exception ( ) ;
125- }
126-
127- return fields ;
128- }
129-
130- return null ;
131- }
132-
133102 /// <summary>
134103 /// Returns a value that indicates whether partial response should be bypassed.
135104 /// </summary>
@@ -174,21 +143,24 @@ public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext co
174143 using ( var jsonWriter = CreateJsonWriter ( writer ) )
175144 {
176145 var jsonSerializer = CreateJsonSerializer ( ) ;
146+ var request = context . HttpContext . Request ;
177147
178- Fields fields = null ;
179-
180- if ( ! ShouldBypassPartialResponse ( context . HttpContext . Request ) )
148+ if ( ! ShouldBypassPartialResponse ( request ) && request . Query . ContainsKey ( "fields" ) )
181149 {
182- fields = GetPartialResponseFields ( context . HttpContext . Request ) ;
183- }
150+ Fields fields ;
184151
185- if ( fields == null )
186- {
187- jsonSerializer . Serialize ( jsonWriter , context . Object ) ;
152+ if ( ! this . TryGetFields ( request , out fields ) )
153+ {
154+ response . StatusCode = 400 ;
155+
156+ await writer . FlushAsync ( ) ;
157+ }
158+
159+ PartialJsonUtilities . RemovePropertiesAndArrayElements ( context . Object , jsonWriter , jsonSerializer , value => fields . Matches ( value ) ) ;
188160 }
189161 else
190162 {
191- PartialJsonUtilities . RemovePropertiesAndArrayElements ( context . Object , jsonWriter , jsonSerializer , value => fields . Matches ( value ) ) ;
163+ jsonSerializer . Serialize ( jsonWriter , context . Object ) ;
192164 }
193165 }
194166
@@ -198,5 +170,17 @@ public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext co
198170 await writer . FlushAsync ( ) ;
199171 }
200172 }
173+
174+ private bool TryGetFields ( HttpRequest request , out Fields fields )
175+ {
176+ var queryOption = request . Query [ "fields" ] . First ( ) ;
177+
178+ if ( ! Fields . TryParse ( queryOption , out fields ) )
179+ {
180+ return false ;
181+ }
182+
183+ return true ;
184+ }
201185 }
202186}
0 commit comments