使用HttpClient发送字节数组到WebAPI服务器我想将这个数据发送到WebAPI服务器:放;}publicbyte[]内容{get;放;}}将此代码用于服务器:[Route("Incoming")][ValidateModel]publicasyncTaskPostIncomingData(SomePostRequestrequestData){//POST逻辑在这里}这-对于客户端:varclient=newHttpClient();client.BaseAddress=newUri("http://localhost:25001/");client.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/json"));varcontent=newFormUrlEncodedContent(newDictionary{{"id","1"},{"content","123"}});varresult=awaitclient.PostAsync("api/SomeData/Incoming",content);结果.EnsureSuccessStatusCode();一切正常(至少,调试器在PostIncomingData的断点处停止)。由于有一个字节数组,我不想将其序列化为JSON,而是想将其作为二进制数据发布以减少网络流量(类似于application/octet-stream)。如何实现这个目标?我试过使用MultipartFormDataContent,但看起来我无法理解MultipartFormDataContent如何匹配控制器方法的签名。例如,将内容替换为:varcontent=newMultipartFormDataContent();content.Add(newFormUrlEncodedContent(newDictionary{{"id","1"}}));varbinaryContent=newByteArrayContent(newbyte[]{1,2,3});binaryContent.Headers.ContentType=newMediaTypeHeaderValue("application/octet-stream");content.Add(binaryContent,"content");varresult=awaitclient.PostAsync("api/SomeData/Incoming",content);结果.EnsureSuccessStatusCode();导致错误415(“不支持的媒体类型”)。WebAPIv2.1及更高版本支持开箱即用的BSON(二进制JSON),甚至包括MediaTypeFormatter。这意味着您可以以二进制格式发布整个消息。如果要使用,需要在WebApiConfig中设置:现在您在客户端使用相同的BsonMediaTypeFormatter来序列化您的请求:};//为BSON.client设置接受头.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/bson"));varrequest=newSomePostRequest{Id=20,Content=newbyte[]{2,5,7,10}};//POST使用BSONformatter.MediaTypeFormatterbsonFormatter=newBsonMediaTypeFormatter();varresult=awaitclient.PostAsync("api/SomeData/Incoming",request,bsonFormatter);结果.EnsureSuccessStatusCode();或者,您可以使用Json.NET将您的类序列化为BSON。然后,指定您要使用“application/bson”作为“Content-Type”:varjsonSerializer=newJsonSerializer();varrequest=newSomePostRequest{Id=20,Content=newbyte[]{2,5,7,10}};jsonSerializer.Serialize(bson,请求);varclient=newHttpClient{BaseAddress=newUri("http://www.yourservicelocation.com")};client.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/bson"));varbyteArrayContent=newByteArrayContent(stream.ToArray());byteArrayContent.Headers.ContentType=newMediaTypeHeaderValue("application/bson");varresult=awaitclient.PostAsync("api/SomeData/Incoming",byteArrayContent);结果.EnsureSuccessStatusCode();我创建了这个通用的跨平台方法来使用Json.NET库来支持BSON格式,以便我们将来可以更轻松地重用它。它在Xamarin平台上也能正常工作。publicstaticasyncHttpResponseMessagePostBsonAsync(stringurl,Tdata){using(varclient=newHttpClient()){//Specifiy'Accept'headerAsBSON:请求服务器以BSON格式返回数据client.DefaultRequestHeaders.Accept.Clear();client.DefaultRequestHeaders.Accept.Add(newMediaTypeWithQualityHeaderValue("application/bson"));//指定'Content-Type'头:告诉服务器将发布哪种格式的数据//发布数据将作为Bson格式varbSonData=HttpExtensions.SerializeBson(data);varbyteArrayContent=newByteArrayContent(bSonData);byteArrayContent.Headers.ContentType=newMediaTypeHeaderValue("application/bson");varresponse=awaitclient.PostAsync(url,byteArrayContent);响应.EnsureSuccessStatusCode();返回响应;}}帮助将数据序列化为BSON格式的方法:publicstaticbyte[]SerializeBson(Tobj){using(MemoryStreamms=newMemoryStream()){using(BsonWriterwriter=newBsonWriter(ms)){JsonSerializerserializ呃=新的JsonSerializer();serializer.Serialize(writer,obj);}返回ms.ToArray();然后你可以像这样使用Post方法:varresponse=awaitPostBsonAsync("api/SomeData/Incoming",requestData);Fyi,用于protobuf序列化以请求文字postLoginRequestloginRequest=newLoginRequest(){Code="UserId",Password="myPass",CMToken="eIFt4lYTKGU:APA91bFZPe3XCDL2r1JUJuEQLlN3FoeFw9ULpw8ljEavNdo9Lc_-Qua4w9pTqdOFLTb92Kf03vyWBqkcvbBfYEno4NQIvp21kN9sldDt40eUOdy0NgMRXf2Asjp6FhOD1Kmubx1Hq7pc",};byte[]rawBytes=ProtoBufSerializer.ProtoSerialize(loginRequest);varclient=newHttpClient();client.BaseAddress=newUri("http://localhost:9000/");client.DefaultRequestHeaders.Accept.Clear();客户端.DefaultRequestHeaders.Accept。添加(新的MediaTypeWithQualityHeaderValue(“应用程序/x-protobuf”));//varbSonData=HttpExtensions.SerializeBson(数据);varbyteArrayContent=newByteArrayContent(rawBytes);byteArrayContent.Headers.ContentType=newMediaTypeHeaderValue("application/x-protobuf");varresult=client.PostAsync("Api/Login",byteArrayContent).Result;Console.WriteLine(result.IsSuccessStatusCode);我将字节数组转换为Base64字符串以发布:等待client.PostAsJsonAsync(apiUrl,new{message="",content=Convert.ToBase64String(yourByteArray),});并且接收方可以通过以下方式将字节数组转换回Base64字符串:以上是C#学习教程:使用HttpClient将字节数组发布到WebAPI如果服务器分享的所有内容对你有用,需要了解更多C#学习教程,希望你多多关注——stringbase64Str=(string)postBody.data;byte[]fileBytes=Convert.FromBase64String(base64Str);本文收集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,如需转载请注明出处:
