繁体   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