Google API更改导致MONO错误:System.Net.Http.HttpClientHandler:.ctor()中的IL代码无效:方法正文为空

问题描述:

我必须更改旧版Google Analytics API后面的身份验证系统认证系统正在失效。作为SO后的结果是,我的身份验证文件就来自:Google API更改导致MONO错误:System.Net.Http.HttpClientHandler:.ctor()中的IL代码无效:方法正文为空

protected override void Load(ContainerBuilder builder) 
{ 
    builder.Register(c => 
    { 
     var service = new AnalyticsService("mrfreeman.com"); 
     service.setUserCredentials("[email protected]", "jellyfish"); 
     return service; 
    }); 

    builder.RegisterType<AnalyticsNewsletterTrackingSource>().As<INewsletterTrackingSource>(); 
    builder.RegisterType<AnalyticsSearchTrackingSource>().As<ISearchTrackingSource>(); 

    builder.RegisterType<AnalyticsEmailLinkTracker>().As<IEmailLinkTracker>(); 
} 

要:

private const string ServiceAccountEmail = "[email protected]"; 

private static readonly string KeyPath = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath ?? AppDomain.CurrentDomain.BaseDirectory, "Key.p12"); 

private static readonly X509Certificate2 Certificate = new X509Certificate2(KeyPath, "notasecret", X509KeyStorageFlags.Exportable); 
private readonly ServiceAccountCredential _credential = new ServiceAccountCredential(
     new ServiceAccountCredential.Initializer(ServiceAccountEmail) 
     { 
      Scopes = new[] { "https://www.googleapis.com/auth/analytics" } 
     }.FromCertificate(Certificate)); 

protected override void Load(ContainerBuilder builder) 
{ 
    builder.Register(c => 
    { 
     _credential.RequestAccessTokenAsync(System.Threading.CancellationToken.None).Wait(); 
     var service = new AnalyticsService("mrfreeman.com"); 

     var requestFactory = new GDataRequestFactory("shazbot2.0"); 
     requestFactory.CustomHeaders.Add(string.Format("Authorization: Bearer {0}", _credential.Token.AccessToken)); 
     service.RequestFactory = requestFactory; 

     return service; 
    }); 

    builder.RegisterType<AnalyticsNewsletterTrackingSource>().As<INewsletterTrackingSource>(); 
    builder.RegisterType<AnalyticsSearchTrackingSource>().As<ISearchTrackingSource>(); 

    builder.RegisterType<AnalyticsEmailLinkTracker>().As<IEmailLinkTracker>(); 
} 

做所有复制生成的开发者的电子邮件地址和P12重点转化项目所需的锅炉板。

问题是这样的:它可以在Windows上运行,但是会在mono上运行的服务引发问题,并且依赖于Analytics模块。目前使用4.0.2版本的Mono。

我已经试过什么:

  • 使用单声道的新旧版本 - 3.10和4.2.0预发布中运行的服务(其本身是由Visual Studio内置),并检查是否异常是产生的。
  • 导入System.Net.Http并复制到本地(目前不在服务引用) - 仍然会产生相同的异常

在这个阶段,我走投无路到学习新的谷歌Analytics(分析)API和重写一切从头开始,因为我试图使用旧的API,但用一点运气更新Auth API,但感觉这是一个钝器型解决方案。

堆栈跟踪是任何版本相同的是:

FATAL Unhandled exception occurred. 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidProgramException: Invalid IL code in System.Net.Http.HttpClientHandler:.ctor(): method body is empty. 

    at Google.Apis.Http.HttpClientFactory.CreateHandler (Google.Apis.Http.CreateHttpClientArgs args) <0x40280100 + 0x0003b> in <filename unknown>:0 
    at Google.Apis.Http.HttpClientFactory.CreateHttpClient (Google.Apis.Http.CreateHttpClientArgs args) <0x4027ff90 + 0x0002d> in <filename unknown>:0 
    at Google.Apis.Auth.OAuth2.ServiceAccountCredential..ctor (Google.Apis.Auth.OAuth2.Initializer initializer) <0x4027f6d0 + 0x00438> in <filename unknown>:0 
    at jellyfish.Analytics.AnalyticsModule..ctor() <0x4027ed00 + 0x00103> in <filename unknown>:0 
    at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) 
    at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) <0x7f8257b94780 + 0x0003f> in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) <0x7f8257b94780 + 0x00079> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceMono (Boolean nonPublic) <0x7f82579c1ec0 + 0x00116> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, System.Threading.StackCrawlMark& stackMark) <0x7f82579c1e70 + 0x00049> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, System.Threading.StackCrawlMark& stackMark) <0x7f82579c1c10 + 0x0005c> in <filename unknown>:0 
    at System.Activator.CreateInstance[T]() <0x7f82578dfb70 + 0x0008a> in <filename unknown>:0 
    at Autofac.ModuleRegistrationExtensions.RegisterModule[TModule] (IModuleRegistrar registrar) <0x40273470 + 0x0004f> in <filename unknown>:0 
    at Autofac.ModuleRegistrationExtensions.RegisterModule[TModule] (Autofac.ContainerBuilder builder) <0x40273330 + 0x0006b> in <filename unknown>:0 
    at jellyfish.Cron.Program.BuildContainer (ILog log) <0x402730e0 + 0x0005f> in <filename unknown>:0 
    at jellyfish.Cron.Program.ExecuteJob (System.Type jobType) <0x4021abe0 + 0x0007b> in <filename unknown>:0 
Unknown errno: Protocol error 


Unhandled Exception: 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidProgramException: Invalid IL code in System.Net.Http.HttpClientHandler:.ctor(): method body is empty. 

    at Google.Apis.Http.HttpClientFactory.CreateHandler (Google.Apis.Http.CreateHttpClientArgs args) <0x40280100 + 0x0003b> in <filename unknown>:0 
    at Google.Apis.Http.HttpClientFactory.CreateHttpClient (Google.Apis.Http.CreateHttpClientArgs args) <0x4027ff90 + 0x0002d> in <filename unknown>:0 
    at Google.Apis.Auth.OAuth2.ServiceAccountCredential..ctor (Google.Apis.Auth.OAuth2.Initializer initializer) <0x4027f6d0 + 0x00438> in <filename unknown>:0 
    at jellyfish.Analytics.AnalyticsModule..ctor() <0x4027ed00 + 0x00103> in <filename unknown>:0 
    at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) 
    at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) <0x7f8257b94780 + 0x0003f> in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) <0x7f8257b94780 + 0x00079> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceMono (Boolean nonPublic) <0x7f82579c1ec0 + 0x00116> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, System.Threading.StackCrawlMark& stackMark) <0x7f82579c1e70 + 0x00049> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, System.Threading.StackCrawlMark& stackMark) <0x7f82579c1c10 + 0x0005c> in <filename unknown>:0 
    at System.Activator.CreateInstance[T]() <0x7f82578dfb70 + 0x0008a> in <filename unknown>:0 
    at Autofac.ModuleRegistrationExtensions.RegisterModule[TModule] (IModuleRegistrar registrar) <0x40273470 + 0x0004f> in <filename unknown>:0 
    at Autofac.ModuleRegistrationExtensions.RegisterModule[TModule] (Autofac.ContainerBuilder builder) <0x40273330 + 0x0006b> in <filename unknown>:0 
    at jellyfish.Cron.Program.BuildContainer (ILog log) <0x402730e0 + 0x0005f> in <filename unknown>:0 
    at jellyfish.Cron.Program.ExecuteJob (System.Type jobType) <0x4021abe0 + 0x0007b> in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidProgramException: Invalid IL code in System.Net.Http.HttpClientHandler:.ctor(): method body is empty. 

    at Google.Apis.Http.HttpClientFactory.CreateHandler (Google.Apis.Http.CreateHttpClientArgs args) <0x40280100 + 0x0003b> in <filename unknown>:0 
    at Google.Apis.Http.HttpClientFactory.CreateHttpClient (Google.Apis.Http.CreateHttpClientArgs args) <0x4027ff90 + 0x0002d> in <filename unknown>:0 
    at Google.Apis.Auth.OAuth2.ServiceAccountCredential..ctor (Google.Apis.Auth.OAuth2.Initializer initializer) <0x4027f6d0 + 0x00438> in <filename unknown>:0 
    at jellyfish.Analytics.AnalyticsModule..ctor() <0x4027ed00 + 0x00103> in <filename unknown>:0 
    at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) 
    at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) <0x7f8257b94780 + 0x0003f> in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) <0x7f8257b94780 + 0x00079> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceMono (Boolean nonPublic) <0x7f82579c1ec0 + 0x00116> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceSlow (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, System.Threading.StackCrawlMark& stackMark) <0x7f82579c1e70 + 0x00049> in <filename unknown>:0 
    at System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, System.Threading.StackCrawlMark& stackMark) <0x7f82579c1c10 + 0x0005c> in <filename unknown>:0 
    at System.Activator.CreateInstance[T]() <0x7f82578dfb70 + 0x0008a> in <filename unknown>:0 
    at Autofac.ModuleRegistrationExtensions.RegisterModule[TModule] (IModuleRegistrar registrar) <0x40273470 + 0x0004f> in <filename unknown>:0 
    at Autofac.ModuleRegistrationExtensions.RegisterModule[TModule] (Autofac.ContainerBuilder builder) <0x40273330 + 0x0006b> in <filename unknown>:0 
    at jellyfish.Cron.Program.BuildContainer (ILog log) <0x402730e0 + 0x0005f> in <filename unknown>:0 
    at jellyfish.Cron.Program.ExecuteJob (System.Type jobType) <0x4021abe0 + 0x0007b> in <filename unknown>:0 

我有类似的问题,所以想尝试删除和添加下列DLL来修复它。

删除了System.net.http,OkHttp,ModernClient。发现问题是在引用下添加了ModernClientHttp和OkHttp dlls。

我已经删除了OkHttp和ModernClientHttp,并通过Nuget添加了ModernClientHttp并且适用于我。 如果有帮助,请尝试一下。