@@ -85,7 +85,10 @@ public async Task OnReceived(IMessageSender sender,string messageId, HttpContext
8585 if ( context . Request . HasFormContentType )
8686 {
8787 var collection = await GetFormCollection ( context . Request ) ;
88- httpMessage . Parameters . Add ( "form" , collection ) ;
88+ foreach ( var item in collection )
89+ {
90+ httpMessage . Parameters . Add ( item . Key , item . Value ) ;
91+ }
8992 if ( ! await OnActionExecuting ( new ActionExecutingContext { Context = context , Route = serviceRoute , Message = httpMessage } ,
9093 sender , messageId , actionFilters ) ) return ;
9194 httpMessage . Attachments = RestContext . GetContext ( ) . GetContextParameters ( ) ;
@@ -189,59 +192,75 @@ public async Task<bool> OnException(HttpContext context, HttpServerMessageSender
189192 return true ;
190193 }
191194
192- private async Task < HttpFormCollection > GetFormCollection ( HttpRequest request )
195+ private async Task < Dictionary < string , HttpFormCollection > > GetFormCollection ( HttpRequest request )
193196 {
194- var boundary = GetName ( "boundary=" , request . ContentType ) ;
197+ var boundary = GetName ( "boundary=" , request . ContentType ) ;
195198 var reader = new MultipartReader ( boundary , request . Body ) ;
196199 var collection = await GetMultipartForm ( reader ) ;
197- var fileCollection = new HttpFormFileCollection ( ) ;
198- var fields = new Dictionary < string , StringValues > ( ) ;
199- foreach ( var item in collection )
200+
201+ return collection . ToDictionary ( item => item . Key , item =>
200202 {
201- if ( item . Value is HttpFormFileCollection )
203+ var fieldsDict = new Dictionary < string , StringValues > ( ) ;
204+ if ( item . Value . Fields . HasValue )
202205 {
203- var itemCollection = item . Value as HttpFormFileCollection ;
204- fileCollection . AddRange ( itemCollection ) ;
206+ fieldsDict . Add ( item . Key , item . Value . Fields . Value ) ;
205207 }
206- else
207- {
208- var itemCollection = item . Value as Dictionary < string , StringValues > ;
209- fields = fields . Concat ( itemCollection ) . ToDictionary ( k => k . Key , v => v . Value ) ;
210208
211- }
212- }
213- return new HttpFormCollection ( fields , fileCollection ) ;
209+ return new HttpFormCollection ( fieldsDict , item . Value . HttpFormFileCollection ) ;
210+ } ) ;
214211 }
215212
216- private async Task < IDictionary < string , object > > GetMultipartForm ( MultipartReader reader )
213+ private async Task < IDictionary < string , ( StringValues ? Fields , HttpFormFileCollection HttpFormFileCollection ) > > GetMultipartForm ( MultipartReader reader )
217214 {
218- var section = await reader . ReadNextSectionAsync ( ) ;
219- var collection = new Dictionary < string , object > ( ) ;
215+ var section = await reader . ReadNextSectionAsync ( ) ;
216+ var collection = new Dictionary < string , ( StringValues ? Fields , HttpFormFileCollection HttpFormFileCollection ) > ( ) ;
220217 if ( section != null )
221- {
222- var name = GetName ( "name=" , section . ContentDisposition ) ;
223- var fileName = GetName ( "filename=" , section . ContentDisposition ) ;
218+ {
219+ var name = GetName ( "name=" , section . ContentDisposition ) ;
220+ var fileName = GetName ( "filename=" , section . ContentDisposition ) ;
224221 var buffer = new MemoryStream ( ) ;
225222 await section . Body . CopyToAsync ( buffer ) ;
226- if ( string . IsNullOrEmpty ( fileName ) )
223+ if ( string . IsNullOrEmpty ( fileName ) )
227224 {
228225 var fields = new Dictionary < string , StringValues > ( ) ;
229226 StreamReader streamReader = new StreamReader ( buffer ) ;
230- fields . Add ( name , new StringValues ( UTF8Encoding . Default . GetString ( buffer . GetBuffer ( ) , 0 , ( int ) buffer . Length ) ) ) ;
231- collection . Add ( name , fields ) ;
227+ fields . Add ( name , new StringValues ( Encoding . Default . GetString ( buffer . GetBuffer ( ) , 0 , ( int ) buffer . Length ) ) ) ;
228+ collection . Add ( name , ( fields [ name ] , null ) ) ;
232229 }
233230 else
234231 {
235232 var fileCollection = new HttpFormFileCollection ( ) ;
236233 StreamReader streamReader = new StreamReader ( buffer ) ;
237- fileCollection . Add ( new HttpFormFile ( buffer . Length , name , fileName , buffer . GetBuffer ( ) ) ) ;
238- collection . Add ( name , fileCollection ) ;
234+ fileCollection . Add ( new HttpFormFile ( buffer . Length , name , fileName , buffer . GetBuffer ( ) ) ) ;
235+ collection . Add ( name , ( null , fileCollection ) ) ;
239236 }
240- var formCollection = await GetMultipartForm ( reader ) ;
241- foreach ( var item in formCollection )
237+ var formCollection = await GetMultipartForm ( reader ) ;
238+ foreach ( var item in formCollection )
242239 {
243240 if ( ! collection . ContainsKey ( item . Key ) )
244- collection . Add ( item . Key , item . Value ) ;
241+ collection . Add ( item . Key , item . Value ) ;
242+ else
243+ {
244+ var ( fields , httpFormFileCollection ) = collection [ item . Key ] ;
245+ if ( item . Value . Fields . HasValue && ! fields . HasValue )
246+ {
247+ fields = item . Value . Fields . Value ;
248+ }
249+
250+ if ( httpFormFileCollection == null )
251+ {
252+ httpFormFileCollection = item . Value . HttpFormFileCollection ;
253+ }
254+ else
255+ {
256+ var formFiles =
257+ item . Value . HttpFormFileCollection . Where ( v =>
258+ ! httpFormFileCollection . Exists ( p => p . FileName == v . FileName ) ) ;
259+ httpFormFileCollection . AddRange ( formFiles ) ;
260+ }
261+
262+ collection [ item . Key ] = ( fields , httpFormFileCollection ) ;
263+ }
245264 }
246265 }
247266 return collection ;
0 commit comments