自己的网站没有域名,知名的网页制作公司多少钱,做宣传海报的网站,win7网站服务器制作软件在C#中通过WebService或API传递byte参数#xff08;如文件、图像等二进制数据#xff09;时#xff0c;通常有以下几种实现方式#xff1a;
1. 使用Base64编码#xff08;推荐REST API#xff09;
将byte数组转换为Base64字符串传输#xff0c;适用于JSON格式的API如文件、图像等二进制数据时通常有以下几种实现方式
1. 使用Base64编码推荐REST API
将byte数组转换为Base64字符串传输适用于JSON格式的API
// 客户端发送
byte[] fileBytes File.ReadAllBytes(test.jpg);
string base64Data Convert.ToBase64String(fileBytes);// 通过HTTP POST发送示例使用HttpClient
using (var client new HttpClient())
{var content new StringContent(JsonConvert.SerializeObject(new { Data base64Data }));var response await client.PostAsync(https://api.example.com/upload, content);
}// 服务端接收ASP.NET Core示例
[HttpPost(upload)]
public IActionResult Upload([FromBody] UploadRequest request)
{byte[] bytes Convert.FromBase64String(request.Data);// 处理bytes...
}2. 直接传输byte数组适用于SOAP/WCF
SOAP WebService或WCF可直接支持byte[]类型参数
// WCF服务契约
[ServiceContract]
public interface IFileService
{[OperationContract]void UploadFile(byte[] fileData);
}// 客户端调用添加服务引用后
byte[] bytes File.ReadAllBytes(test.pdf);
FileServiceClient client new FileServiceClient();
client.UploadFile(bytes);3. 使用Multipart表单REST API文件上传
通过MultipartFormDataContent传输文件流
// 客户端上传文件
using (var client new HttpClient())
using (var fileStream File.OpenRead(test.zip))
{var content new MultipartFormDataContent();content.Add(new StreamContent(fileStream), file, test.zip);var response await client.PostAsync(https://api.example.com/upload, content);
}// 服务端接收ASP.NET Core
[HttpPost(upload)]
public async TaskIActionResult Upload(IFormFile file)
{using (var memoryStream new MemoryStream()){await file.CopyToAsync(memoryStream);byte[] bytes memoryStream.ToArray();// 处理bytes...}
}4.使用文件流Stream
通过HttpClient和MultipartFormDataContent实现流式传输避免一次性加载整个文件到内存
using (var client new HttpClient())
using (var fileStream File.OpenRead(largefile.zip)) // 以流模式打开文件
{var content new MultipartFormDataContent();content.Add(new StreamContent(fileStream), file, largefile.zip); // 直接传递文件流var response await client.PostAsync(https://api.example.com/upload, content)服务端接收流式数据
在ASP.NET Core中通过IFormFile或直接读取请求体流处理
[HttpPost(upload)]
public async TaskIActionResult Upload(IFormFile file)
{using (var stream file.OpenReadStream())using (var fileStream new FileStream(savedfile.zip, FileMode.Create)){await stream.CopyToAsync(fileStream); // 流式写入本地文件}return Ok();
}或直接读取原始请求体
[HttpPost(stream-upload)]
public async TaskIActionResult StreamUpload()
{using (var stream Request.Body)using (var fileStream new FileStream(savedfile.zip, FileMode.Create)){await stream.CopyToAsync(fileStream);}return Ok();
}关键注意事项
性能优化大文件建议用流Stream而非一次性加载byte[]到内存。
安全性验证文件类型和大小防止恶意上传。
WCF配置若用WCF需检查maxReceivedMessageSize配置是否足够。
根据场景选择合适方式SOAP/WCF用原生byte[]REST API推荐Base64或Multipart表单。
注意
在C#中使用Encoding.UTF8或Encoding.Default处理二进制数据如文件字节时导致文件损坏的根本原因是UTF-8编码并非为二进制数据设计而是用于文本字符的编码和解码。
UTF-8的编码规则UTF-8会对无效的Unicode字节序列如非文本二进制数据进行替换或丢弃导致原始字节被篡改。
典型场景
将文件字节直接通过Encoding.UTF8.GetString()转换为字符串再通过Encoding.UTF8.GetBytes()转回时部分字节可能被替换为0xEF 0xBF 0xBDUTF-8的替换字符。
若二进制数据中包含高位字节如0xFFUTF-8会将其视为非法字符并处理造成数据丢失。