簡體   English   中英

對Xamarin PCL使用HttpClient

[英]Using HttpClient for Xamarin PCL

我正在Xamarin中創建一個PCL,該PCL將Microsoft.Net.Http Nuget包用於HttpClient類。 我使用HttpClient將音頻文件發布到Web API。 到目前為止,這對我來說效果很好,但是現在在嘗試將文件流式傳輸到API時遇到了麻煩。 API在其文檔中表示要添加一個要“分塊”的“ Transfer-encoding”標頭,以便接受流式傳輸的文件。 我無法像使用其他標頭那樣手動添加標頭,而是從HttpClient的屬性進行設置。 問題是,當我調用HttpClient.PostAsync()時,它會引發異常,因為HttpWebRequest的SendChunk屬性不是True。 我假設HttpWebRequest對象是由HttpClient創建的,但是我不知道如何將SendChunk屬性設置為True。 當我自己創建一個HttpWebRequest對象時,即使它是一個公共屬性,也無法訪問SendChunk屬性。 我猜想它與PCL有關,但是SeundChunk屬性確實出現在Microsoft.Net.Http程序集中。

簡而言之,我需要將標頭“ Transfer-encoding:chunked”放入我的HttpClient標頭中,但是不能。 當我在PCL中工作時某些屬性不可用時,如何添加此標頭?

public async Task<string> PostAsync(string url, Stream content, Dictionary<string,string> requestHeaders, Dictionary<string,string> contentHeaders)
    {
        var httpClient = new System.Net.Http.HttpClient();
        var httpContent = new System.Net.Http.StreamContent(content);

        httpClient.Timeout = TimeSpan.FromSeconds(20);
        httpClient.DefaultRequestHeaders.TransferEncodingChunked = true;

        if (requestHeaders != null)
        {
            foreach (var headerName in requestHeaders.Keys)
            {
                httpClient.DefaultRequestHeaders.Add(headerName, requestHeaders[headerName]);
            }
        }
        if (contentHeaders != null)
        {
            foreach (var headerName in contentHeaders.Keys)
            {
                httpContent.Headers.Add(headerName, contentHeaders[headerName]);
            }
        }

        HttpResponseMessage response = null;

        try
        {
            response = await httpClient.PostAsync(url, httpContent);
        }

編輯:

我將代碼更新為如下形式

             HttpClientHandler handler = new HttpClientHandler();

        System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient(handler);
        httpClient.DefaultRequestHeaders.TransferEncodingChunked = true;

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);

        var httpContent = new System.Net.Http.StreamContent(content);

        request.Content = httpContent;

        if (handler.SupportsTransferEncodingChunked())
        {
            request.Headers.TransferEncodingChunked = true;
        }

        HttpResponseMessage response = null;


            response = await httpClient.SendAsync(request);

SendAsync引發異常,指出“ System.Net.ProtocolViolationException:SendChunked應該為true”。 我在這篇文章http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient-for-net-framework-and-windows-phone.aspx之后對代碼進行了建模。

我正在嘗試處理類似的情況。 我遇到了一些可能會有所幫助的選項。

ModernHTTPClient

或這個休息銳利

作為狀態更新,我確實使ModernHTTPClient正常工作。 我的解決方案雖然必須刪除程序包文件夾中的內容,然后安裝該nuget程序包,然后還原其他程序包。 否則解決方案很簡單

var httpClient = new HttpClient(new NativeMessageHandler());

我在Xamarin論壇上的此鏈接中找到了一個方便的庫; https://forums.xamarin.com/discussion/25274/httpclient-in-pcl

Robert McLaws和Richard Beauchamp提供了一個名為PortableRest的Nuget程序包。

它是一個使用可移植類庫(.NET 4.5,Silverlight 5,Windows Phone 8.x和Windows 8.x)中的REST API的庫。 設計為與RestSharp部分兼容。

GitHub鏈接在這里: https : //github.com/AdvancedREI/PortableRest Nuget包在這里: https ://www.nuget.org/packages/PortableRest

資料來源: https : //forums.xamarin.com/discussion/25274/httpclient-in-pcl

要使用此功能:

var client = new RestClient { BaseUrl = Constants.API_BASE_URI };
var request = new RestRequest("Token", HttpMethod.Post, ContentTypes.FormUrlEncoded);
request.AddHeader("Accept", "application/json");
request.AddParameter("grant_type", "password", ParameterEncoding.UriEncoded);
request.AddParameter("username", userEntry.Text, ParameterEncoding.UriEncoded);
request.AddParameter("password", passwordEntry.Text, ParameterEncoding.UriEncoded);

var result = await client.SendAsync<AuthToken>(request);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM