@@ -145,69 +145,23 @@ public async Task AddFormFieldAsync(string name, string value)
145145 public async Task AddFormFieldAsync ( IEnumerable < KeyValuePair < string , string > > keyValues )
146146 {
147147 this . EnsureNotGetOrHead ( ) ;
148+ this . EnsureMediaTypeEqual ( UrlEncodedContent . MediaType ) ;
148149
149150 if ( keyValues == null )
150151 {
151152 return ;
152153 }
153154
154- var formBody = default ( byte [ ] ) ;
155- const string mediaType = "application/x-www-form-urlencoded" ;
156-
157- if ( this . Content != null )
155+ var formContent = this . Content as UrlEncodedContent ;
156+ if ( formContent == null )
158157 {
159- this . EnsureMediaTypeEqual ( mediaType ) ;
160- formBody = await this . Content . ReadAsByteArrayAsync ( ) ;
161- this . Content . Dispose ( ) ;
158+ formContent = new UrlEncodedContent ( this . Content ) ;
162159 }
163160
164- var bytesContent = MergeFields ( formBody , keyValues ) ;
165- var byteArrayContent = new ByteArrayContent ( bytesContent ) ;
166- byteArrayContent . Headers . ContentType = new MediaTypeHeaderValue ( mediaType ) ;
167- this . Content = byteArrayContent ;
161+ await formContent . AddFormFieldAsync ( keyValues ) ;
162+ this . Content = formContent ;
168163 }
169164
170- /// <summary>
171- /// 合并内容
172- /// </summary>
173- /// <param name="formBody"></param>
174- /// <param name="keyValues"></param>
175- /// <returns></returns>
176- private static byte [ ] MergeFields ( byte [ ] formBody , IEnumerable < KeyValuePair < string , string > > keyValues )
177- {
178- var encoding = Encoding . UTF8 ;
179- var kvs = from kv in keyValues select string . Format ( "{0}={1}" , kv . Key , HttpUtility . UrlEncode ( kv . Value , encoding ) ) ;
180- var stringContent = string . Join ( "&" , kvs ) ;
181-
182- if ( formBody != null && formBody . Length > 0 )
183- {
184- stringContent = "&" + stringContent ;
185- }
186-
187- var byteConent = encoding . GetBytes ( stringContent ) ;
188- return MergeBytes ( formBody , byteConent ) ;
189- }
190-
191- /// <summary>
192- /// 合并字节组
193- /// </summary>
194- /// <param name="formBody"></param>
195- /// <param name="byteConent"></param>
196- /// <returns></returns>
197- private static byte [ ] MergeBytes ( byte [ ] formBody , byte [ ] byteConent )
198- {
199- if ( formBody == null || formBody . Length == 0 || byteConent == null )
200- {
201- return byteConent ;
202- }
203-
204- var bytes = new byte [ formBody . Length + byteConent . Length ] ;
205- formBody . CopyTo ( bytes , 0 ) ;
206- byteConent . CopyTo ( bytes , formBody . Length ) ;
207- return bytes ;
208- }
209-
210-
211165 /// <summary>
212166 /// 添加文件内容到已有的Content
213167 /// 要求content-type为multipart/form-data
@@ -353,10 +307,7 @@ private bool SetCookie(string cookieValues, bool useUrlEncode)
353307 /// <returns></returns>
354308 private MultipartContent CastOrCreateMultipartContent ( )
355309 {
356- if ( this . Content != null )
357- {
358- this . EnsureMediaTypeEqual ( "multipart/form-data" ) ;
359- }
310+ this . EnsureMediaTypeEqual ( "multipart/form-data" ) ;
360311
361312 var httpContent = this . Content as MultipartContent ;
362313 if ( httpContent == null )
@@ -378,13 +329,12 @@ private MultipartContent CastOrCreateMultipartContent()
378329 /// <exception cref="NotSupportedException"></exception>
379330 private void EnsureMediaTypeEqual ( string newMediaType )
380331 {
381- var contentType = this . Content . Headers . ContentType ;
382- if ( contentType == null )
332+ var existsMediaType = this . Content ? . Headers . ContentType ? . MediaType ;
333+ if ( string . IsNullOrEmpty ( existsMediaType ) == true )
383334 {
384335 return ;
385336 }
386337
387- var existsMediaType = contentType . MediaType ;
388338 if ( string . Equals ( existsMediaType , newMediaType , StringComparison . OrdinalIgnoreCase ) == false )
389339 {
390340 var message = string . Format ( "Content-Type必须保持为{0}" , existsMediaType ) ;
0 commit comments