2014-01-11 2 views
18

Я хочу создать приложение ASP.NET для Google BigQuery с использованием OAuth2 и рамки .Net 4.5. Я побежал эту NuGet устанавливаетАварии приложений ASP.net - Не удалось загрузить файл или сборку «Microsoft.Threading.Tasks.Extensions.Desktop»

Install-Package Google.Apis.Bigquery.v2 -Pre 
Install-Package Google.Apis.Authentication.OAuth2 -Version 1.2.4696.27634 

Install-Package Google.Apis -Pre 
Install-Package Google.Apis.Auth -Pre 

и я разместил соответствующий «usings» в файл код «Default.aspx.cs»:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Threading; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

using Google.Apis.Auth.OAuth2; 
using Google.Apis.Services; 
using Google.Apis.Bigquery.v2; 
using Google.Apis.Bigquery.v2.Data; 

namespace BigQueryDemoApp 
{ 
    public partial class _Default : Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      UserCredential credential; 
      FileStream stream; 

      using (stream = new FileStream(
        Server.MapPath("~/client_secrets.json"), 
        FileMode.Open, FileAccess.Read) 
       ) 
      { 
       GoogleWebAuthorizationBroker.Folder = 
        "Tasks.Auth.Store"; 
       credential = GoogleWebAuthorizationBroker. 
        AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, 
        new[] { BigqueryService.Scope.Bigquery }, 
        "user", CancellationToken.None).Result; 
      } 

      // Initialize the service. 
      var Service = new BigqueryService(
       new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "BigQueryDemo" 
       } 
      ); 
     } 
    } 
} 

Я поставил эту конкретную страницу в качестве стартовой страницы проекта , Я выбрал «Установленное приложение», когда я построил файл ИД клиента в консоли Google

APIS & auth -> Credentials -> CREATE NEW CLIENT ID 

, и я уверен, что я добавил этот файл (client_secrets.json) с исследователем решения в VS2013. В коде, я убедился, что я правильно сопоставлен с файлом client_secrets с Server.MapPath. Для машинного удостоверения я использовал этот код

<https://code.google.com/p/google-api-dotnet-client/wiki/OAuth2> 

в качестве отправной точки. При запуске приложения, оно возвращает ошибочную страницу браузера, которая начинается с

Не удалось загрузить файл или сборку «Microsoft.Threading.Tasks.Extensions.Desktop, Version = 1.0.16.0, Culture = нейтрально, PublicKeyToken = b03f5f7f11d50a3a 'или одной из его зависимостей. Система не может найти указанный файл.

и сбой на линии "credential =". Я попытался добавить некоторые изображения фактической страницы с разбивкой браузера ASP.net, показывающей трассировку загрузки загрузки/трассировку стека/и т. Д., Но похоже, что у меня нет прав учетной записи для этого. Когда я поставил точку останова в строке «удостоверение =», а затем запустить приложение через

DEBUG -> Start Debugging 

в VS2013, страница останавливается на «верительных =» линии и открывает файл сборщика, ищет файл

"GoogleClientSecrets.cs" 

из каталога

«C: \ код \ google.com \ Google-апи-Dotnet-клиент \ умолчанию \ Tools \ Google.Apis.Release \ Bin \ Debug \ вывода \ умолчанию \ Src \ GoogleApis.Auth \ OAuth2 \ GoogleClientSecrets.cs "

, который нигде не находится на диске. Используя трассировку загрузки сборки на сгенерированной странице ошибок ASP.net, я попытался выполнить поиск в предлагаемых файлах конфигурации, но ничего не получилось. В более общем плане я попытался найти эту проблему в StackOverflow, и, хотя я действительно нашел какое-то упоминание об этом, ни один из этих материалов не помог.

ответ

29

Поскольку ошибка основана на том, что последняя версия Microsoft.Bcl.Async не работает в .NET 4.5, вы можете попробовать сделать следующее:

Откройте Диспетчер пакетов консоли, и выполните следующие команды:
1) Uninstall-пакет Microsoft.Bcl.Async -Force
2) Install-Package Microsoft.Bcl.Async -Version 1.0.16

Он работает в образце я нахожусь в настоящее время писать. Пожалуйста, дайте мне знать, если это сработает для вас.

ОБНОВЛЕНИЕ (21 марта): Вы можете обновить пакет (доступна новая версия 1.0.166-бета - https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.166-beta).
Я тестировал его на VS2013 с платформой .NET 4.5, и он работает.

+0

Здравствуйте. Извините за задержку. Я попробовал ваше предложение, и оно работает. Спасибо за вашу помощь! - Frank –

3

Я уже сталкивался с этой ошибкой раньше. Похоже, что пакет Bcl.Async содержит ссылку на Microsoft.Threading.Tasks.Extensions.Desktop при запуске приложений .NET 4.0, но почему-то это отсутствует в приложении .NET 4.5.

Мой совет для вас (пока я не буду считать себя с владельцем Microsoft.Bcl.Async, почему это происходит) заключается в копировании Microsoft.Threading.Tasks.Extensions.Desktop из пакетов \ Microsoft.Bcl.Async.1.0 .165 \ lib \ net40 \ Microsoft.Threading.Tasks.Extensions.Desktop.dll в папку BIN. Он должен решить эту проблему.

UPDATE (17 марта): добавить следующее событие после сборки для вашего проекта:

копирования/Y «$ (SolutionDir) пакеты \ Microsoft.Bcl.Async.1.0.16 \ Lib \ net40 \ Microsoft.Threading.Tasks.Extensions.Desktop.dll» "$ (TargetDir) Microsoft.Threading.Tasks.Extensions.Desktop.dll"

к сожалению, это не решение этой проблемы еще от владельцев пакета Bcl.Async.

+0

, который работал для меня. Спасибо – Manu

2

Этот подход не исправит проблему - я получил ту же ошибку времени выполнения. Но после восстановления, я заметил, что VS2013 компилятор показал это предупреждение, которое я отформатированный немного для редактора SO

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1635,5): warning 
MSB3247: Found conflicts between different versions of the same dependent assembly. In Visual 
Studio, double-click this warning (or select it and press Enter) to fix the conflicts; 
otherwise, add the following binding redirects to the "runtime" node in the application 
configuration file: 

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Threading.Tasks.Extensions.Desktop" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" /> 
     <bindingRedirect oldVersion="0.0.0.0-1.0.165.0" newVersion="1.0.165.0" /> 
    </dependentAssembly> 
</assemblyBinding> 

поэтому я уронил предложенный блок в файле приложения web.config. Затем приложение решило работать. Я понятия не имею, почему это работает сейчас, но у меня создается впечатление, что блок XML и/или ссылка, которую вы упомянули, каким-то образом затронули библиотеку Microsoft.Threading.Tasks.Extensions.Desktop или некоторые низкоуровневые механизмы внутри .Net, или оба. Или ни того, ни другого. В любом случае, спасибо за вашу помощь. Хотел бы я только лучше понять внутреннюю технику.

+0

Я связался с владельцем этого пакета NuGet, надеюсь, мы скоро найдем лучшее решение. – peleyal

+0

Видимо, 1.0.166 (https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.166-beta) исправляет эту проблему. – peleyal

4

Они выпустили новую версию -Package Microsoft.Bcl.Async.

Если у кого-то есть эта проблема, пожалуйста, установите «последняя» версия вместо 1.0.16.

Я надеюсь, что это сработает для вас.

+0

Чтобы быть предельно ясным: установите пакеты nuget API Google, затем добавьте текущий Microsoft.Bcl.Async, который заменит ссылки на пакеты Google – Guillaume

Смежные вопросы