![](/img/trans.png)
[英]POST NameValueCollection to Web API using WebClient.UploadValues for .NET 3.5
[英]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的方法:
- HttpClient實例是配置擴展,設置默認標頭,取消未完成的請求等的地方。
- 您可以通過一個HttpClient實例發出任意多個請求。
- HttpClient不綁定到特定的HTTP服務器或主機。 您可以使用相同的HttpClient實例提交任何HTTP請求。
- 您可以從HttpClient的派生來創建特定的網站或模式專門的客戶
- HttpClient使用面向任務的新模式來處理異步請求,從而大大簡化了管理和協調多個未完成請求的過程。
最后,我將使用Fiddler在.NET 4.x解決方案和3.5之間進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.