Google Calendar API和共享托管问题

时间:2016-09-23 12:18:13

标签: c#-4.0 google-api google-calendar-api google-api-dotnet-client service-accounts

我试图在需要编辑功能的网页中使用公开的Google日历。 为此,我创建了日历并将其公之于众。然后,我创建了一个Google服务帐户和相关的客户端ID。 我还启用了Calendar API并将v3 dll添加到项目中。 我下载了p12证书以及问题出现的时间。

对Google的调用是使用X509证书,但.NET框架的构建方式是它使用用户临时文件夹。 由于它是Web服务器(GoDaddy)的共享主机,因此我无法修改应用程序池标识。 结果,我收到了这个错误:

  

System.Security.Cryptography.CryptographicException:系统不能   找到指定的文件。

致电时:

X509Certificate2 certificate = new X509Certificate2(GoogleOAuth2CertificatePath,
                "notasecret", X509KeyStorageFlags.Exportable);

然后在Google调用中使用cerificate var:

ServiceAccountCredential credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(GoogleOAuth2EmailAddress)
                {
                    User = GoogleAccount,
                    Scopes = new[] { CalendarService.Scope.Calendar }
                }.FromCertificate(certificate));

......但我从来没有那么远。

问题:有没有办法以不同的方式拨打电话,即不使用X509证书而是使用JSON? 或者我可以使用x509函数来使用常规临时位置而不是我无法访问的用户位置,因为我无法更改应用程序池中的标识吗?

由于我完全陷入困境,所以我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

避免需要担心文件位置的一个简单选项是将证书嵌入到程序集中。在Visual Studio中,右键单击该文件并显示其属性。在Build Action下,选择“Embedded resource”。

然后您应该可以使用以下内容加载数据:

// In a helper class somewhere...
private static byte[] LoadResourceContent(Type type, string resourceName)
{
    string fullName = type.Namespace + "." + resourceName;
    using (var stream = type.Assembly.GetManifestResourceStream(fullName)
    {
        var output = new MemoryStream();
        stream.CopyTo(output);
        return output.ToArray();
    }
}

然后:

byte[] data = ResourceHelper.LoadResourceContent(typeof(MyType), "Certificate.p12");
var certificate = new X509Certificate2(data, "notasecret", X509KeyStorageFlags.Exportable);

此处MyType是与您的资源位于同一文件夹中的某种类型。

请注意,.NET中有许多不同的“Web”项目类型...根据您正在使用的完全项目类型,您可能需要调整它。