簡體   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