将RestSharp POST请求转.NET HttpClient时遇格式错误求助
解决HttpClient添加Content-Disposition头时的格式错误问题
你遇到的The format of value 'filename="translations.html"' is invalid错误,核心原因是直接用字符串添加Content-Disposition头不符合HTTP规范的格式要求。RestSharp在处理这类头时做了宽松兼容,但HttpClient会严格校验头的格式,所以直接传入字符串会触发校验失败。
正确的解决方法
Content-Disposition是一个带参数的复合HTTP头,不能直接通过Add方法传入字符串,应该使用.NET提供的ContentDispositionHeaderValue类来构造,这样能保证格式完全符合标准。
修正后的代码如下:
string previewMarkup = "<!doctype html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <title>My page</title>\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n</head>\r\n<body>\r\n\t<h1>My page</h1>\r\n\t<p>This is a paragraph<br />That needs to be translated</p>\r\n</body>\r\n</html>"; var targetLangs = new { targetLangs = new[] { "da", "de", "de-AT", "de-BE" } }; string targetLanguagesParamJson = JsonConvert.SerializeObject(targetLangs); // 初始化内容,先指定HTML编码 HttpContent httpContent = new StringContent(previewMarkup, Encoding.UTF8, MediaTypeNames.Text.Html); // 用ContentDispositionHeaderValue正确构造文件头 httpContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "translation.html" }; // 添加Memsource自定义头 httpContent.Headers.Add("Memsource", targetLanguagesParamJson); // 覆盖内容类型为octet-stream httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse(MediaTypeNames.Application.Octet); // 发送请求 HttpResponseMessage httpResponseMessage = await _httpClient.PostAsync( "https://cloud.memsource.com/web/api2/v1/projects/<myProjectId>/jobs?token=<myAuthToken>", httpContent, cancellationToken);
关键说明
- Content-Disposition的正确构造:
ContentDispositionHeaderValue会自动处理头的格式,包括引号和参数分隔,避免手动拼接字符串带来的格式错误。这里指定的attachment是标准的disposition类型,符合文件上传的场景,Memsource能正确识别。 - 内容类型的调整:先通过
StringContent指定UTF-8编码的HTML类型,再覆盖为application/octet-stream,和原RestSharp请求的逻辑保持一致。 - 自定义头的兼容性:
Memsource头的JSON序列化逻辑不需要修改,JsonConvert的默认序列化结果能满足Memsource的要求。
内容的提问来源于stack exchange,提问作者Bo Mortensen
相关产品推荐
相关产品推荐

