c# - 如何在 Xamarin 的同一 API 中传递表单数据和 json?
问题描述
我在 Xamarin 中有一个 API 方法,它使用 .NET Core 作为后端,我想用它来传输表单数据和 JSON 格式。我已经阅读了一些示例,并试图找到一种使其工作的方法。目前我有这个:
public async Task AddUser(User user, MediaFile file)
{
string userRegisterUrl = "http://10.0.2.2:53547/api/PostUser";
var json = JsonConvert.SerializeObject(user);
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
var formData = new MultipartFormDataContent();
formData.Add(new StreamContent(file.GetStream()),"file",string.Format("{0}.png",Guid.NewGuid()));
formData.Add(new StringContent(json),"user");
using (HttpClient client = new HttpClient(clientHandler))
{
var response = await client.PostAsync(userRegisterUrl, formData);
string result = await response.Content.ReadAsStringAsync();
if(response.IsSuccessStatusCode)
{
}
}
}
问题是,无论我做什么,我都会不断收到此错误:“415 Unsupported Media Type”。现在我知道它想说的是服务器不会接受有效负载格式,因为它不受支持,但我没有知道如何做到这一点,它不需要我安装外部 nuget 包来实现它。我知道这是可能的,我尝试过的如下:
- 首先,我尝试创建一个 HttpContent,它将媒体文件作为流获取,并使用“form-data”的 ContentDispositionHeaderValue 和“application/octet-stream”的 MediaTypeHeaderValue 添加了一些标头。我将序列化它的 json 格式正如我在我的方法中所做的那样,并将其传递给 MultipartFormDataContent 值,但没有任何成功,因为我得到了上面提到的错误。
- 第二次尝试我没有将任何标题传递给媒体文件,json 对象保持不变,我使用 try catch 块来传递内容但没有任何运气,因为它给了我同样的错误。
上面的方法是我实现的最后一个方法,这就是我在服务器端的方法:
[HttpPost]
public async Task<ActionResult<User>> PostUser(User user,IFormFile file)
{
if (string.IsNullOrWhiteSpace(_env.WebRootPath))
{
_env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
}
if(user!=null)
{
_context.User.Add(user);
var users = Path.Combine(_env.WebRootPath, "uploads", user.Name);
if (!Directory.Exists(users)) Directory.CreateDirectory(users);
if (file.Length > 0)
{
using (var fileStream = new FileStream(Path.Combine(users, file.FileName), FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
}
await _context.SaveChangesAsync();
return CreatedAtAction("GetUser", new { id = user.IdUser }, user);
}
最初我将两种方法分开,一种用于上传图像,另一种用于存储用户数据,但我想在每次注册新用户时使用用户名创建一个文件夹,有人建议我应该合并这两种方法。如何我无需处理不受支持的格式即可达到预期的效果?
解决方案
Alternatif 解决方案,您可以使用Refit来简化您的请求。它可以在任何带有/不带的 xamarin 表单项目中使用ReactiveUI
推荐阅读
- jira - 使用 Jira 链接服务和 Azure 数据工厂的 Jira 表中的自定义字段列
- react-native - 如何使用函数更改平面列表的数据?
- angular - 角度 nb-step 和 nb-select 验证
- symfony - Twilio - twilio 如何知道要调用哪个客户端
- postgresql - Kotlin/PostgreSQL 查询在预期时仅返回最后一行具有选定 ID 的所有行
- javascript - 将函数传递给 useEffect 并返回结果
- python - 如何遍历二维数组并添加元素
- excel - 将图片保存为PNG Excel
- sql - 如何使 SQL Server 列中的自动大写
- c# - 从自定义数据注释属性访问 IConfiguration