C# 实现微信永久素材上传,一直报 41005的错误,但使用Fiddler就可以直接上传图片。

Url:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=XXX&type=XXX

调用
var client = new HttpClient();
var steam=new MemoryStream(imageFile.ImageByte);
var content= new StreamContent(steam);
content.Headers.Remove("Content-Disposition");
content.Headers.TryAddWithoutValidation("Content-Disposition", "form-data; name=\"media\";filename=\"111.png\"" +
"");
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "image/png");
contentAll.Add(content);
client.DefaultRequestHeaders.Add("User-Agent", "KC");
var result = client.PostAsync(url, contentAll).Result.Content.ReadAsStringAsync().Result;

问题解决了:还是微信在接受素材是对于multipart/form-data要求和HttpClient中的MultipartFormDataContent格式存在差异导致的,也就是boundary的值不可以存在双引号。完成代码如下:

  public MaterialImageReturn UploadMaterialImage(MaterialImage imageFile, string token)
       {
            var apitype = "material";
            var url = string.Concat(BaseUrl, apitype, "/add_material", "?access_token=", token, "&type=", "thumb");
            var boundary = "fbce142e-4e8e-4bf3-826d-cc3cf506cccc";
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("User-Agent", "KnowledgeCenter");
            client.DefaultRequestHeaders.Remove("Expect");
            client.DefaultRequestHeaders.Remove("Connection");
            client.DefaultRequestHeaders.ExpectContinue = false;
            client.DefaultRequestHeaders.ConnectionClose = true;
            var content = new MultipartFormDataContent(boundary);
            content.Headers.Remove("Content-Type");
            content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
            var contentByte = new ByteArrayContent(imageFile.ImageByte);
            content.Add(contentByte);
            contentByte.Headers.Remove("Content-Disposition");
            contentByte.Headers.TryAddWithoutValidation("Content-Disposition", "form-data; name=\"media\";filename=\"111.png\"" +                                                                           "");
            contentByte.Headers.Remove("Content-Type");
            contentByte.Headers.TryAddWithoutValidation("Content-Type", "image/png");
            try
            {
                var result = client.PostAsync(url, content);
                if (result.Result.StatusCode != HttpStatusCode.OK)
                    throw new Exception(result.Result.Content.ReadAsStringAsync().Result);
                if (result.Result.Content.ReadAsStringAsync().Result.Contains("media_id"))
                {
                    var resultContent = result.Result.Content.ReadAsStringAsync().Result;
                    var materialEntity = JsonConvert.DeserializeObject<MaterialImageReturn>(resultContent);
                    return materialEntity;
                }
                throw new Exception(result.Result.Content.ReadAsStringAsync().Result);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + ex.InnerException.Message);
            }
       }

上传文件的代码不正确

http://blog.163.com/lewei8@yeah/blog/static/7327417020111120103515205/

imageFile.ImageByte的值本身已经是从文件读取的二进制流。