In my recent post I have shown, how to track web requests issued against remote server I don’t have a control over. Curious reader could ask at this point – but what have I broken this time? And the answer is as usual – personally did nothing wrong, I was just doing my job. I had to port some HTTP related code from using Windows Runtime-specific HttpClient (i.e. Windows.Web.Http.HttpClient) to also work outside the sandbox on a regular .NET 4.5 desktop version and start using System.Net.Http.HttpClient instead.
Then I noticed that everything worked fine except multipart form-data submissions using POST method that were behaving unexpectedly bad (timeouting or returning an error immediately). There was nothing unusual mentioned on MSDN, so I started to compare sent requests using both implementation. It turned-out of course, the problem lied deeper in the framework in a value serialized as a boundary part of the Content-Type field. HttpClient from the System.Net.Http somehow was adding extra quotes around it, while the one from Windows.Web.Http didn’t. Even though server should accept both values (according to RFC2046 section 5.1.1), it actually didn’t and was waiting for correct boundary.
Simple fix by manually overwriting the guilty header can look like that:
var request = new HttpRequestMessage(HttpMethod.Post, url); var boundary = "--" + Guid.NewGuid().ToString("D"); request.Content = new MultipartFormDataContent(boundary); // fill content // ... // update the Content-Type header to be accepted by the server: request.Content.Headers.Remove("Content-Type"); request.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary); // send request: var result = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token); result.EnsureSuccessStatusCode();
World saved. Job done!