@@ -145,69 +145,23 @@ public async Task AddFormFieldAsync(string name, string value)
145
145
public async Task AddFormFieldAsync ( IEnumerable < KeyValuePair < string , string > > keyValues )
146
146
{
147
147
this . EnsureNotGetOrHead ( ) ;
148
+ this . EnsureMediaTypeEqual ( UrlEncodedContent . MediaType ) ;
148
149
149
150
if ( keyValues == null )
150
151
{
151
152
return ;
152
153
}
153
154
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 )
158
157
{
159
- this . EnsureMediaTypeEqual ( mediaType ) ;
160
- formBody = await this . Content . ReadAsByteArrayAsync ( ) ;
161
- this . Content . Dispose ( ) ;
158
+ formContent = new UrlEncodedContent ( this . Content ) ;
162
159
}
163
160
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 ;
168
163
}
169
164
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
-
211
165
/// <summary>
212
166
/// 添加文件内容到已有的Content
213
167
/// 要求content-type为multipart/form-data
@@ -353,10 +307,7 @@ private bool SetCookie(string cookieValues, bool useUrlEncode)
353
307
/// <returns></returns>
354
308
private MultipartContent CastOrCreateMultipartContent ( )
355
309
{
356
- if ( this . Content != null )
357
- {
358
- this . EnsureMediaTypeEqual ( "multipart/form-data" ) ;
359
- }
310
+ this . EnsureMediaTypeEqual ( "multipart/form-data" ) ;
360
311
361
312
var httpContent = this . Content as MultipartContent ;
362
313
if ( httpContent == null )
@@ -378,13 +329,12 @@ private MultipartContent CastOrCreateMultipartContent()
378
329
/// <exception cref="NotSupportedException"></exception>
379
330
private void EnsureMediaTypeEqual ( string newMediaType )
380
331
{
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 )
383
334
{
384
335
return ;
385
336
}
386
337
387
- var existsMediaType = contentType . MediaType ;
388
338
if ( string . Equals ( existsMediaType , newMediaType , StringComparison . OrdinalIgnoreCase ) == false )
389
339
{
390
340
var message = string . Format ( "Content-Type必须保持为{0}" , existsMediaType ) ;
0 commit comments