Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从.NET 3.5 WebClient或WebRequest将对象发布到Web API_C#_.net_Vb.net_Asp.net Web Api_Webclient - Fatal编程技术网

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

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

我正在尝试创建一个.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 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链接。它应该能帮助你: