C# 如何从.NET 3.5 WebClient或WebRequest将对象发布到Web API
我正在尝试创建一个.NET3.5客户端库来连接到WebAPI端点。在4.0和4.5中,它相当简单:C# 如何从.NET 3.5 WebClient或WebRequest将对象发布到Web API,c#,.net,vb.net,asp.net-web-api,webclient,C#,.net,Vb.net,Asp.net Web Api,Webclient,我正在尝试创建一个.NET3.5客户端库来连接到WebAPI端点。在4.0和4.5中,它相当简单: Dim mediaType = New MediaTypeHeaderValue("application/json") Dim jsonFormatter = New JsonMediaTypeFormatter() Dim client As New HttpClient client.BaseAddress = New System.Uri(_url) Dim content As Http
Dim mediaType = New MediaTypeHeaderValue("application/json")
Dim jsonFormatter = New JsonMediaTypeFormatter()
Dim client As New HttpClient
client.BaseAddress = New System.Uri(_url)
Dim content As HttpContent = New ObjectContent(Of MyObject)(Me.MyObject, jsonFormatter)
Dim resp As HttpResponseMessage = client.PostAsync("api/Post/", content).Result
If resp.IsSuccessStatusCode Then
With HttpContext.Current.Response
SetHeaders(HttpContext.Current.Response, Me.MyObject.Type)
.BinaryWrite(resp.Content.ReadAsByteArrayAsync().Result)
.Flush()
.Close()
.End()
End With
Else
_isSuccess = False
End If
我通过ObjectContent通过HttpClient通过HttpContent类发送MyObject。API端点接受它为:
Public Function Post(obj As MyObject) As HttpResponseMessage
Dim x As New MyObjectHandler(obj)
Dim result As New HttpResponseMessage
result.Content = New StreamContent(x.GetStream)
Return result
End Function
当我发布到这里时,我的对象是完整的,所有变量都在正确的布局中。以我尝试使用的.NET3.5方式,情况并非如此。POST到达函数并开始单步执行,但对象中没有任何值。以下是我尝试使用.NET 3.5 WebClient进行遍历的测试代码:
Dim client As New WebClient
client.Headers(HttpRequestHeader.ContentType) = "application/json"
client.BaseAddress = New System.Uri(_url).ToString
Dim json As String = NewtonSoft.Json.JsonConvert.SerializeObject(Me.MyObject)
Dim result = client.UploadData("api/Post/", Encoding.UTF8.GetBytes(json))
为了获得WebClient示例以将对象推送到API端点,正确的方法是什么?我是否需要为3.5客户端创建特殊端点 您是否尝试过只使用HttpClient NuGet包 见: 根据,可能有一些额外的HTTP goo正在使用WebClient传输:
Dim client As New WebClient
client.Headers(HttpRequestHeader.ContentType) = "application/json"
client.BaseAddress = New System.Uri(_url).ToString
Dim json As String = NewtonSoft.Json.JsonConvert.SerializeObject(Me.MyObject)
Dim result = client.UploadData("api/Post/", Encoding.UTF8.GetBytes(json))
如果您习惯于使用WebClient或HttpWebRequest,那么它是值得的
注意到HttpClient在一些有趣的方面有所不同–下面是如何
要考虑HttpClient:
HttpClient实例是配置扩展的地方,set
默认标题、取消未完成的请求等。
您可以通过单个HttpClient实例发出任意数量的请求。
HttpClient不绑定到特定的HTTP服务器或主机;你可以
使用相同的HttpClient实例提交任何HTTP请求。
您可以从HttpClient派生,为特定的应用程序创建专门的客户端
地点或模式
HttpClient使用新的面向任务的模式来处理异步请求,使得管理和协调多个未完成的请求变得非常容易。
最后,我将使用.NET 4.x解决方案与3.5解决方案进行比较。您应该能够使用JSON.NET序列化程序对对象进行序列化 JsonMediaTypeFormatter使用以下设置,不确定这些设置是否会更改负载的形状:
return new JsonSerializerSettings()
{
MissingMemberHandling = MissingMemberHandling.Ignore,
TypeNameHandling = TypeNameHandling.None
};
如果所有其他操作都失败,请编写一个.net 4客户端,发布端点,并使用fiddler将有效负载与使用.net 3.5客户端发送的负载进行比较。我猜这只是一个客户端配置问题。签出bleow链接。它应该能帮助你: