繁体   English   中英

如何从.NET 3.5 WebClient或WebRequest将对象发布到Web API

[英]How to POST an Object to Web API from .NET 3.5 WebClient or WebRequest

我正在尝试创建.NET 3.5客户端库以连接到Web API端点。 在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 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

我通过HttpContent类通过HttpClient通过ObjectContent发送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

当我对此进行发布时,我的对象是完整无缺的,并且所有变量的布局正确。 在我尝试使用的.NET 3.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客户端创建一个特殊的端点?

您应该能够使用JSON.Net序列化程序对对象进行序列化。

JsonMediaTypeFormatter使用以下设置,不确定这些设置是否会更改有效负载的形状:

  return new JsonSerializerSettings()
        {
            MissingMemberHandling = MissingMemberHandling.Ignore,
            TypeNameHandling = TypeNameHandling.None
        };

如果所有其他方法均失败,则编写一个.net 4客户端,过帐终结点,并使用提琴手将有效负载与使用.net 3.5客户端发送的负载进行比较。 我猜这只是一个客户端配置问题。

您是否尝试过只用HttpClient的NuGet包?

请参阅: http : //www.nuget.org/packages/HttpClient

此页面上 ,可能会使用WebClient传输一些额外的HTTP信息:

如果您习惯于使用WebClient或HttpWebRequest,那么值得注意的是HttpClient在一些有趣的方面有所不同–这是考虑HttpClient的方法:

  1. HttpClient实例是配置扩展,设置默认标头,取消未完成的请求等的地方。
  2. 您可以通过一个HttpClient实例发出任意多个请求。
  3. HttpClient不绑定到特定的HTTP服务器或主机。 您可以使用相同的HttpClient实例提交任何HTTP请求。
  4. 您可以从HttpClient的派生来创建特定的网站或模式专门的客户
  5. HttpClient使用面向任务的新模式来处理异步请求,从而大大简化了管理和协调多个未完成请求的过程。

最后,我将使用Fiddler在.NET 4.x解决方案和3.5之间进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM