【发布时间】:2016-05-24 20:55:40
【问题描述】:
简而言之,我需要发送一个 byte[] 数组作为正文值。问题是[FromBody] 始终为空。到目前为止,我看到的所有解决方案都涉及以一种或另一种方式将传递的值传递给字符串。如果传递的原始内容是纯文本 (ascii),这很好,但在我发送(例如)jpg 的情况下,这不起作用。
意识到并知道我不能使用 HTTPClient 以任何形式添加它是非常重要的,因为某种原因会在各种地方破坏解决方案。我被困在使用 WebClient。
这是我下面的代码:
调用页面:
Private Function UploadFile(targetURL As String, fileAttachment As Byte()) As String
Dim retVal As String = String.Empty
Using client = New WebClient()
Try
Dim request As HttpWebRequest = DirectCast(WebRequest.Create(targetURL), HttpWebRequest)
request.Method = "POST"
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = fileAttachment.Length
Dim requestStream As Stream = request.GetRequestStream()
requestStream.Write(fileAttachment, 0, fileAttachment.Length)
Dim response As WebResponse = request.GetResponse()
Dim respStream As Stream = response.GetResponseStream()
Dim reader As New StreamReader(respStream)
retVal = reader.ReadToEnd()
respStream.Dispose()
reader.Dispose()
Catch ex As WebException
If ex.Status = WebExceptionStatus.ProtocolError Then
Dim wbrsp As HttpWebResponse = CType(ex.Response, HttpWebResponse)
Throw New HttpException(CInt(wbrsp.StatusCode), wbrsp.StatusDescription)
Else
Throw New HttpException(500, ex.Message)
End If
End Try
End Using
Return retVal
End Function
WebAPI 方法:
[Route("Upload/{appName}/{appKey}/{fileName}/{fileExt}")]
public async Task<string> Post(string appName, string appKey, string fileName, string fileExt, [FromBody] byte[] values) {
//snip as rest is not needed since values is always null
什么是合理的解决方案,以便不将字节数组转换为字符串(具有“破坏”值的效果)?
【问题讨论】:
-
为什么不将“value”参数类型设置为流式传输,然后在 api 中将其转换为字节?
-
问题是因为 FromBody 参数始终为空,从请求对象中获取它会返回一个字符串,如果源不是纯文本(如 jpg),这会导致字节数组出现问题.无论如何,我想通了并发布了答案。
标签: c# vb.net post asp.net-web-api2 webclient