HttpClient грешка в PCL файл

Току-що създадох PCL проект във VS 2013 и добавих следните Nuget пакети към моя проект и избрах всички налични платформи, тъй като искам да използвам това отново в .NET и в моите Xamarin проекти.

  • Microsoft HTTP клиентски библиотеки
  • Json.NET

Но на следния ред:

HttpResponseMessage response = await client.PostAsync(uri, content);

Получавам следната грешка:

Cannot await 
'System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>'

и на този ред:

return await response.Content.ReadAsStringAsync();

Получавам следната грешка:

Cannot await 'System.Threading.Tasks.Task<string>'

Това е пълният код, който работи добре в споделения проект от моето универсално приложение.

    public static async Task<string> PostDataAsync<T>(string uriString, 
    T data, ContentType contentType, bool isWrapped)
    {
        HttpClient client = new HttpClient();

        Uri uri = new Uri(uriString);

        string wrappedName = data.GetType().Name;
        string postData = string.Empty;
        string prefix = string.Empty;
        string suffix = string.Empty;

        if (contentType == ContentType.Xml)
        {
            //postData = SerializerHelper.SerializeObjectToXML<T>(data, 
            //true, true, true, false);
        }
        else
        {
            if (isWrapped)
            {
                prefix = string.Concat("{\"", data.GetType().Name, "\":");
                suffix = "}";
            }
            postData = prefix + JsonConvert.SerializeObject(data) + suffix;
        }

        client.DefaultRequestHeaders.Accept.Add(new 
        MediaTypeWithQualityHeaderValue(contentType == 
        ContentType.Json ? "application/json" : "application/xml"));

       client.DefaultRequestHeaders.Host = uri.Host;

        StringContent content = new StringContent(postData,
        System.Text.Encoding.UTF8, contentType ==
        ContentType.Json ? "application/json" : "application/xml");

        HttpResponseMessage response = await client.PostAsync(uri, content);

        if (response.StatusCode == HttpStatusCode.NotFound)
            throw new NetworkConnectivityException();
        else if (response.StatusCode != HttpStatusCode.OK)
            throw new Exception(response.RequestMessage.ToString());

        return await response.Content.ReadAsStringAsync();
    }

Това са само няколко от статиите, които прочетох, но нито една не сочи правилното решение:

Успях да създам работеща функция и се различава малко от тази по-горе, но принципът остава същият, но не съм сигурен, че това е правилният начин да го направя, тъй като правя „изчакването“ във функцията вместо от приложението, което го извиква. Някой може просто да иска да потвърди дали по-долу също е добре?? Имайте предвид, че докато се компилира, все още не съм имал възможност да опитам в Xamarin.

public static Task<U> PostDataAsync<T, U>(string baseAddress, string
requestUri, T data, ContentType contentType = ContentType.Json, 
bool isWrapped = true, double timeOut = 1200000)
    {
        string contentTypeString = (contentType ==
        ContentType.Json ? "json" : "xml");

        using (HttpClientHandler handler = new HttpClientHandler())
        {
            using (HttpClient client = new HttpClient(handler))
            {
                client.BaseAddress = new Uri(baseAddress);
                client.Timeout = TimeSpan.FromMilliseconds(timeOut);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/" + 
                    contentTypeString));

                string postData = string.Empty;
                string prefix = string.Empty;
                string suffix = string.Empty;

                if (contentType == ContentType.Json)
                {
                    if (isWrapped)
                    {
                        prefix = string.Concat("{\"", 
                        data.GetType().Name, "\":");
                        suffix = "}";
                    }
                    postData = prefix + JsonConvert.
                    SerializeObject(data) + suffix;
                }
                else
                {

                }

                HttpRequestMessage request = new 
                HttpRequestMessage(HttpMethod.Post, requestUri);
                request.Content = new StringContent(postData,
                                                    Encoding.UTF8,
                                                    "application/" +
                contentTypeString);

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

                HttpResponseMessage response = null;
                string dataReturned = string.Empty;
                U dataObject = default(U);

                Task resp = client.SendAsync(request)
                      .ContinueWith(responseTask =>
                      {
                          response = responseTask.Result;
                          if (responseTask.Result.IsSuccessStatusCode)
                          {
                              Task<string> dataTask = 
                              response.Content.ReadAsStringAsync();

                              dataReturned = dataTask.Result.ToString();
                              dataObject = JsonConvert.
                              DeserializeObject<U>(FixJson
                               (dataReturned, "Result"));
                          }
                          else
                          {
                              dataReturned = "HTTP Status: " +
                              response.StatusCode.ToString() + 
                              " - Reason: " + response.ReasonPhrase;
                          }
                      });

                resp.Wait();

                return Task.Factory.StartNew(() => dataObject);
            }
        }
    }

Някакви идеи как мога да разреша проблемите с първата си функция? Втората функция добре ли е?

Благодаря.


person Thierry    schedule 26.08.2015    source източник


Отговори (1)


Инсталирайте пакета NuGet Microsoft.Bcl.Async, за да имате поддръжка за async и await.

person Wosi    schedule 26.08.2015
comment
Все още ли имам нужда от това в .NET 4.5? Мислех, че това е необходимо само за .NET 4 или по-ниска версия? - person Thierry; 26.08.2015
comment
Това наистина беше проблемът през цялото време!! Не разбирам защо не се включват автоматично, когато решението е избрано Silverlight или WP като част от платформата за поддръжка! - person Thierry; 29.08.2015