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

时间:2015-06-02 14:38:11

标签: c# asp.net-mvc-3 google-api appharbor

我在AppHarbor上托管的MVC解决方案遇到了一个奇怪的问题。在当地它运行得非常好,但我在生产时(appharbor)给我一个例外。

堆栈跟踪代码:

string keyFilePath = HttpContext.Current.Server.MapPath("~/key.p12");
string serviceAccountEmail = "my-email-here@developer.gserviceaccount.com";
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);

ServiceAccountCredential credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
   {
      Scopes = new[] { "https://spreadsheets.google.com/feeds/" }
   }.FromCertificate(certificate));

进一步探讨这个问题,问题出在我的代码的第一行:

string keyFilePath = HttpContext.Current.Server.MapPath("~/key.p12");

在检查构建之后,我的key.p12似乎甚至不在服务器上(即使在推送它之后)。 AppHarbor拒绝某些文件吗?

1 个答案:

答案 0 :(得分:0)

AppHarbor不拒绝某些文件,但MsBuild配置为使用显式输出目录。这可能与您通常在同一目录中构建解决方案的本地环境不同。默认情况下,除非您明确配置,否则AppHarbor使用的MsBuild目标不会复制某些文件。

可以通过引用项目中的证书文件,然后将“Build Action”属性设置为“Content”来解决此问题。这应该导致文件被复制到输出目录。

另一种解决方案是将证书嵌入到嵌入式资源中,这里是initializing an embedded certificate and installing it in the user's certificate store。请注意,您通常不必安装证书即可使用它。