c# - 将图像作为 base64string 发送到 WebAPI;base64 字符串太长
问题描述
我最近关注了 Ahsan Siddique 的这些教程
使用 Azure 数据库在 ASP.Net 中开发 RESTful API。
第 1 部分 https://www.c-sharpcorner.com/article/creating-sql-database-in-azure-portal/
第 2 部分 https://www.c-sharpcorner.com/article/developing-restful-api-in-asp-net-with-add-method/
在 Xamarin.Android 中使用 RESTful API
第 4 部分 https://www.c-sharpcorner.com/article/sumption-restful-apis-in-xamarin-android/
我设法让所有代码工作,但我被困在我试图将 base64 字符串传递给 web api 的部分。本教程没有我遇到的部分。我在 Postman 上测试了我的 POST API,我收到了这条错误消息,“HTTP 错误 414。请求 URL 太长。”
下面你可以看到我的部分代码:
public String BitmapToBase64(Bitmap bitmap)
{
//Java.IO.ByteArrayOutputStream byteArrayOutputStream = new Java.IO.ByteArrayOutputStream();
MemoryStream memStream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
byte[] byteArray = memStream.ToArray();
return Base64.EncodeToString(byteArray, Base64Flags.Default);
}
User user = new User ();
user.ID = "1";
user.name = "Kelly";
user.profilepic = BitmapToBase64(NGetBitmap(uri)); //this is the part where base64string is too long
HttpClient client = new HttpClient();
string url = $"http://test.azurewebsites.net/api/User/{user.ID}?name={user.name}&profilepic={user.profilepic}";
var uri1 = new System.Uri(url); //base64
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
var json = JsonConvert.SerializeObject(feedback);
var content = new StringContent(json, Encoding.UTF8, "application/json");
response = await client.PostAsync(uri1, content);
if (response.StatusCode == System.Net.HttpStatusCode.Accepted)
{
Toast.MakeText(this, "Your profile is updated.", ToastLength.Long).Show();
}
else
{
Toast.MakeText(this, "Your profile is not updated." + feedback.profilepic, ToastLength.Long).Show();
}
我需要帮助!先感谢您!
更新:这就是我的控制器类目前的样子
public HttpResponseMessage Update_User(int ID, string name, string profilepic)
{
if (!ModelState.IsValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
UserTable newUser = new UserTable();
var entry = db.Entry<UserTable>(newUser);
entry.Entity.ID = ID;
entry.Entity.name = name;
entry.Entity.profilepic = profilepic;
entry.State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
}
return Request.CreateResponse(HttpStatusCode.Accepted, "Your profile is updated.");
}
解决方案
如评论中所述,请勿将 base64 图像作为 url/GET 参数的一部分发送。
而是将其附加到 POST 请求的正文中。
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("profilepic", user.profilepic)
});
var result = await client.PostAsync(url, content);
推荐阅读
- javascript - 如何像这些网站一样进行慢速滚动
- go - kubernetes 客户端只看一次资源
- spring-boot - 如何在 OAuth2 资源服务器中提取自定义主体?
- css - 为什么样式不适用于我的元素?
- php - 未经授权的 Mirosoft Graph 请求?日历.阅读
- angular - Visual Studio 警告:(ESLint)无法加载配置“defaults/configurations/eslint”以扩展。引用自 C:\Users\{username}\.eslintrc
- c++ - 模块“XXXXX”未安装 qt/qml
- java - 如何在Java中将十六进制字符串转换为字节数组
- python - 如何向 Google Cloud Natural Language API 发送一批字符串?
- python - 在pyqt5中创建布局的最佳方法是响应式的?