Serenity For asp.net core项目发布后运行不正常解决

Serenity For asp.net core项目使用 dotnet publish 指令发布到iis后,使用时候报错

Script data Template.* is not found in registered script list!

解决方法:

修改 project.json 的 publishOptions 配置节 增加 "**/*.html", 项

  "publishOptions": {
			"include": [
				"wwwroot",
				"**/*.cshtml",
				"**/*.html",
				"appsettings.json",
				"web.config"
			]
  },

 

升级.Net Core RC2的那些事(二)——升级ASP.Net Core项目

升级完类库项目,第二篇,我们来升级ASP.Net Core项目

修改global.json与project.json

这里可以参照,升级.Net Core RC2的那些事(一)

这里补充一点就是如果你觉得这样修改复杂,你完全可以新建一个项目,把这两个文件拷贝过来,再加上自己引用过的包,也是可以的,看你觉得那种方法更简单点

增加Program入口类

Program.cs:

	public class Program
	{
		public static void Main(string[] args)
		{
			var host = new WebHostBuilder()
				.UseKestrel()
				.UseContentRoot(Directory.GetCurrentDirectory())
				.UseIISIntegration()
				.UseStartup<Startup>()
				.Build();

			host.Run();
		}
	}

并移除Startup.cs中的

		// Entry point for the application.
		public static void Main(string[] args) => WebApplication.Run<Startup>(args);

修改类名和命名空间名

将所有 Microsoft.AspNet.* 的命名空间修改为 Microsoft.AspNetCore.*

参照下表修改对应的类名

旧类 新类
IWebApplicationBuilder IWebHostBuilder
WebApplicationBuilder WebHostBuilder
IWebApplication IWebHost
WebApplication WebHost
WebApplicationOptions WebHostOptions
WebApplicationDefaults WebHostDefaults
WebApplicationService WebHostService
WebApplicationConfiguration WebHostConfiguration

如果你有使用全局环境变量,也请对照下表修改

Old prefix New prefix
ASPNET_WEBROOT ASPNETCORE_WEBROOT
ASPNET_SERVER ASPNETCORE_SERVER
ASPNET_APP ASPNETCORE_APPLICATIONNAME
ASPNET_ENVIRONMENT ASPNETCORE_ENVIRONMENT
ASPNET_DETAILEDERRORS ASPNETCORE_DETAILEDERRORS

修改Logging

如果你有使用日志功能,需要修改下日志等级的配置,具体在 appsettings.json

例如:

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },

具体请对照下表:

Old Levels New Levels
Critical Critical
Error Error
Warning Warning
Information Information
Verbose Debug
Debug Trace

关于PostAsJsonAsync与ReadAsAsync

如果以前有使用 Microsoft.AspNet.WebApi.Client 的,当然现在也是可以直接引用这个包来实现Web API之间的对接的

但我在实战中发现,也许是因为引用包之间的版本冲突,会有诡异的异常,于是我自己实现了一个Helper也分享给大家

	public static class HttpClientHelper
	{
		public static async Task<T> ReadAsAsync<T>(this HttpContent content)
		{
			return JsonConvert.DeserializeObject<T>(await content.ReadAsStringAsync());
		}

		public static async Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string url, T model)
		{
			SetHeader(client);
			return await client.PostAsync(url, SetContent(model));
		}

		private static StringContent SetContent<T>(T model)
		{
			return new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
		}

		private static void SetHeader(HttpClient client)
		{
			client.DefaultRequestHeaders.Clear();
			client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
			client.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
		}

		public static async Task<HttpResponseMessage> PutAsJsonAsync<T>(this HttpClient client, string url, T model)
		{
			SetHeader(client);
			return await client.PutAsync(url, SetContent(model));
		}
	}

关于文件上传保存

以前有.SaveAsAsync,这样便捷的扩展方法保存的,现在没有了(或者说藏到了哪里目前找不到了),于是就需要手写

相关的代码片段:

if (model.picdata != null)
			{
				var extName = ContentDispositionHeaderValue.Parse(model.picdata.ContentDisposition).FileName.Trim('"');
				int i = extName.LastIndexOf('.');
				extName = extName.Substring(i);
				string fileName = Guid.NewGuid() + extName;
				var filePath = _hostingEnvironment.WebRootPath + @"\upload\" + fileName;
				//保存文件
				using (var fileStream = new FileStream(filePath, FileMode.Create))
				{
					var inputStream = model.picdata.OpenReadStream();
					await inputStream.CopyToAsync(fileStream);
				}
				//await model.picdata.SaveAsAsync(filePath);
			}

本人的项目中就这一处需要保存文件的,就不封装了:),你喜欢也可以自己封装下

关于System.Drawing

由于项目中需要使用图片处理(生成二维码),好多大神建议另外建项目调用,但我想做在一个项目中,故有此一段

首先,ASP.Net Core项目是不支持System.Drawing的,如果需要使用,则需要修改成纯 net461 的项目,这里需要修改一下project.json

1、删除 Microsoft.NETCore.App 配置节

		"Microsoft.NETCore.App": {
			"version": "1.0.0-rc2-3002702",
			"type": "platform"
		},

2、修改 frameworks 配置节,只保留 net461 项

	"frameworks": {
		"net461": {
			"frameworkAssemblies": {
				"System.Drawing": "4.0.0.0"
			},
			"dependencies": {
				"ThoughtWorks.QRCode": "1.1.0",
				"Microsoft.NETCore.Platforms": "1.0.1-rc2-24027"
			}
		}
	},

这样修改完成后就可以在项目中使用 System.Drawing 命名空间了

副作用:

这样修改后,项目是不能在CoreCLR上跑的,Windows环境下不会存在问题,Linux下则需要配置Mono环境才可以

关于Session

现在光在 ConfigureServices 方法中加 services.AddSession(); 是不够的,实际使用时会报错

还需要在 Configure 方法中加 app.UseSession();

发布到IIS

通过VS发布

现在你可以像MVC5那样通过 右键菜单的 发布 功能,用Web Deploy来发布到IIS,需要注意的是目前这个工具对中文的支持不是很好,所以不要使用中文的项目名哟

通过cli发布

你也可以通过以下命令获得发布文件

dotnet publish -c release

然后把获得的文件通过FTP等途径上传到服务器

PS:此命令需要在 project.json 的同级目录下运行

IIS配置

IIS绑定的目录应该是最多DLL的那一层,而不是以前RC1的wwwroot

应用程序池中设置 无托管代码 等,这些基本和RC1一致

其他补充

如果你的项目存在Areas,默认是不会发布出去的,此时需修改project.json的publishOptions配置节,例如:

	"publishOptions": {
		"include": [
			"wwwroot",
			"Views",
			"Areas/Admin/Views",
			"appsettings.json",
			"web.config"
		]
	},

 

升级.Net Core RC2的那些事(一)——升级RC1的类库项目

微软终于发布了.Net Code RC2了,作为一个软粉当然是第一时间升级了。《升级.Net Core RC2的那些事》系列文章主要是记录本人升级RC2的相关步骤以及遇到过的坑。

第一篇先写类库项目(Nuget包项目)的升级

升级VS工具

这里只提供一个下载地址:.NET Core Tooling Preview 1 for Visual Studio 2015

本人主要使用VS2015开发,升级Update2后,只要装这一个东西就够了,使用VSCode的朋友,或需要手动配置环境的朋友,可以Google相关的文章,这里不做赘述。

修改global.json

如果你项目中没有这个文件,则可以忽略

{
  "sdk": {
    "version": "1.0.0-rc1-update2"
  }
}

修改为

{
	"sdk": {
		"version": "1.0.0-preview1-002702"
	}
}

修改project.json

增加packOptions

原来 tags、projectUrl、licenseUrl 这3个配置项、现在需要放到一个名叫packOptions的节点下

如:

	"tags": [ "weixin", "wechat", "微信" ],
	"projectUrl": "http://blog.lishewen.com/",
	"licenseUrl": "http://blog.lishewen.com/",

现在需要修改为

	"packOptions": {
		"tags": [ "weixin", "wechat", "微信" ],
		"projectUrl": "http://blog.lishewen.com/",
		"licenseUrl": "http://blog.lishewen.com/"
	},

frameworks节的修改

原 net451 或 dnx451 需要修改为 net461

原 dotnet5.4 需要修改为

		"netstandard1.5": {
			"imports": "dnxcore50"
		}

dependencies节的修改

这里主要是修改引用包的版本号

原 1.0.0-rc1-final 或 1.0.0-rc1-update2 的包,修改为 1.0.0-rc2-final

其他包则需要修改成 -rc2-24027 结尾的对应包

发布

RC2的工具现在只会生成DLL,并不会像RC1那样直接生成Nuget包

目前如果需要Nuget的发布包,只能通过cli命令行获得

打包命令:

dotnet pack -c release

PS:此命令需要在project.json文件的同级目录下运行

cocos2d-x项目在VS2013编译出错的解决办法

在VS2013编译cocos2d-x的win32项目时,会报错误:

error C2039: “min”: 不是“std”的成员

error C2873: “min”: 符号不能用在 using 声明中

这时需要打开对于报错的.cpp文件,在头部加入

#include <algorithm>

使用Python 3.x脚本创建cocos2d-x项目

从cocos2d-x v2.1.4 以来,cocos2d官方要求通过Python来建立项目。具体可以参考文章

http://www.cnblogs.com/tangchong/p/3439410.html

但官方提供的create_project.py是基于Python 2.7的,我修改了一下令其可以在Python 3.x下运行

覆盖到cocos2d-x\tools\project-creator下面即可

create_project.py For Python 3.x 下载地址:

http://pan.baidu.com/s/1xNhyG

ASP.Net MVC 4项目升级MVC 5的方法

1、备份你的项目

2、从Web API升级到Web API 2,修改global.asax,将

WebApiConfig.Register(GlobalConfiguration.Configuration);

 

修改为

GlobalConfiguration.Configure(WebApiConfig.Register);

 

3、通过Nuget,更新下面的包

包名                                           

旧版本

新版本

Microsoft.AspNet.Razor

2.0.x.x

3.0.0

Microsoft.AspNet.WebPages

2.0.x.x

3.0.0

Microsoft.AspNet.WebPages.WebData

2.0.x.x

3.0.0

Microsoft.AspNet.WebPages.OAuth

2.0.x.x

3.0.0

Microsoft.AspNet.Mvc

4.0.x.x

5.0.0

Microsoft.AspNet.Mvc.Facebook

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.Core

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.SelfHost

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.Client

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.OData

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.WebHost

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.Tracing

4.0.x.x

5.0.0

Microsoft.AspNet.WebApi.HelpPage

4.0.x.x

5.0.0

Microsoft.Net.Http

2.0.x.

2.2.x.

Microsoft.Data.OData

5.2.x

5.6.x

System.Spatial

5.2.x

5.6.x

Microsoft.Data.Edm

5.2.x

5.6.x

Microsoft.AspNet.Mvc.FixedDisplayModes

 

Removed

Microsoft.AspNet.WebPages.Administration

 

Removed

Microsoft-Web-Helpers

 

Microsoft.AspNet.WebHelpers

4、更新根目录的web.config

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!--Two elements removed for Clarity -->
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    <!--WebGrease element removed for Clarity -->
  </assemblyBinding

 

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

 

  <securityPolicy>
   <!--<trustLevel name="Medium"  policyFile="web_mediumtrust.config"/>-->
</securityPolicy>

 

5、修改View文件夹下的web.config

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <!--Elements removed for Clarity.-->
    </namespaces>
  </pages>
</system.web.webPages.razor>

 

  -->
  <pages
      validateRequest="false"
      pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
      pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
      userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <controls>
      <add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
    </controls>
  </pages>
</system.web>

 

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

 

6、右键解决方案,选择卸载项目

7、右键项目,编辑 [ProjectName].csproj

8、找到 ProjectTypeGuids 节,删除Guid {E3E379DF-F4C6-4180-9B81-6769533ABE47},保存

9、右键项目,重新加载项目

Visual Studio 2013 新增改进后的项目模版及社交账号认证

  Visual Studio 2013 包括了新的项目模版及改善的用户体验,能让开发者更快速构建项目和应用。在新界面的帮助下,用户能够创建新的 MVC 项目并且很容易往项目中增加 Web Forms 页面,还可以在 Web Forms 项目中通过脚手架功能使用 Web API。

  当用户在 Visual Studio 2013 中创建 ASP.NET 项目时,能够在 home 页、关于页和联系页中进行基本的导航,此外还能使用 Bootstrap 创建网站的主题 ,无论你使用的是哪种技术――ASP.NET MVC、Web Forms、Web API、SPA。此外,Visual Studio 2013 可以通过 Windows、活动目录和如 Facebook、Twitter、微软账号、Google 等社交账号对用户进行认证,此外,按照项目的需求,Visual Studio 2013 还提供了更多的验证器(providers)。

  Visual Studio 2013 包括一个 Project_Readme.html 文件,这在创建新的项目时就会看到。这个文件包括了在 ASP.NET 中新特性一览和在创建项目后所需的步骤,同时也包括了关于主题定制、部署和网络上的其他资源信息。

  最新发布的 ASP.NET 中包含了 ASP.NET Identity,它是一套新的 membership 系统,能够轻易地将应用数据和用户特定的档案数据进行整合。它也允许你选择在应用中用户档案的持久化模型,包括将数据存储在 SQL Server 数据库,或者类似于 Windows Azure 存储表这样的 NoSQL 数据存储中的能力。

Microsoft.AspNet.Identity.Core.1.0.0, Microsoft.AspNet.Identity.EntityFramework.1.0.0和 Microsoft.AspNet.Identity.Owin.1.0.0 是与 ASP.NET Identity 功能相关的 NuGet 包。 ASP.NET web 优化框架包括用于提高 ASP.NET web 应用性能的如打包、压缩服务。

Microsoft.AspNet.Web.Optimization.1.1.1 以 NutGet 包方式提供,并且包含了 WebGrease Antlr 依赖库。另一方面,Microsoft.AspNet.Providers.Core 包用于存储应用中的 session 数据。

Microsoft.Owin.Security.ActiveDirectory, Microsoft.Owin.Security.Cookies,Microsoft.Owin.Security.Facebook, Microsoft.Owin.Security.Google, Microsoft.Owin.Security.Jwt,Microsoft.Owin.Security.MicrosoftAccount, Microsoft.Owin.Security.OAuth,Microsoft.Owin.Security.Twitter 均以 NuGet 包的形式发布以用于设置 MVC 个人账号、Web 表单、Web API 和 Web API 专用的组织账号时使用。

  Microsoft.AspNet.FriendlyUrls 包能让用户生成友好的 URL,其中一项功能能够让你添加一个视图切换功能,以使用户在移动设备和桌面视图间轻易地进行切换。此外,ScriptManager 控件提供了对 web 优化的支持,此外项目模版能让用户将 jquery 的打包引用注册到 ScriptManager 控件中。

  Visual Studio 2013 包括针对 ASP.NET MVC 和 Web API 项目改进的项目模版,其中包括一个内置帮助页(Microsoft.AspNet.WebAPI.HelpPage)的新模版。

新的.NET编译器——RyuJIT 项目

  Microsoft 正在开发一个新的即时(Just-In-Time,JIT)编译器,该编译器最终会被用于运行 .NET 应用程序。新编译器的代号为“RyuJIT”,它标志着设计哲理的变化。现在的 64 位 JIT 编译器是为了支持在服务器环境中发现的操作配置文件而设计的,这种情况下的执行性能要优于启动性能。为了获得额外的性能提升它还依赖了像 NGen 和后台 JIT 这样的支持技术。但是 RyuJIT 的设计目标考虑了 64 位代码在服务器之外的计算平台上的流行程度。因此,与现在的 x64 JIT 相比,RyuJIT 强调整体的性能提升,包括缩短了应用程序启动时间。

  Microsoft 从事 RyuJIT 项目的一位程序经理 Andrew Pardoe 注意到,一直到现在为止 .NET CodeGEN 团队一直在管理两个独立的代码库,一个针对 X64 .NET JIT 编译器,一个针对 X86 .NET JIT 编译器。RyuJIT 是基于目前 X86 .NET JIT 编译器代码库的。它的最终目标是让 RyuJIT 项目成为现在以及将来所有架构(X86、 X64、ARM 等)上的 .NET JIT 编译器。现在的 RyuJIT 仅支持 X64 架构,同时还有一个针对 64 位 Windows 8.1 和 Windows Server 2012 R2 的社区技术预览版(CTP)。

  安装了 CTP 之后你将能够根据自己的需要体验新的编译器,它并不会替代现在正在使用的 X64 JIT 编译器。如果想要使用 RyuJIT 有两种方式可以选择,或者使用下面的环境变量:COMPLUS_AltJit=*;或者创建一个新的值为*的字符串注册表键 HKEY_Local_Machine\SOFTWARE\Microsoft\.NETFramework\AltJit 。注意,RyuJIT 现在并不支持编辑并继续(Edit & Continue),但是将来的版本将会支持该功能。Microsoft 的 Kevin Frei 声明说,虽然现在的 RyuJIT 仅支持 Windows 8.1 和 Server 2012 R2,但是最终版本的 RyuJIT 将会是完整 .NET 运行时的一部分,在 .NET 支持的所有平台上都将获得完整的支持。

使用Visual Studio 2010与2012工作于相同项目

过去,当开发人员将一个 Visual Studio 项目迁移至新版本时,该项目将没法在任何一个早期版本中使用。Visual Studio 2012 RC 推出了一个叫做“项目往返切换(project round-tripping)“的特性,现在团队可以让项目在 Visual Studio 2010 和 2012 之间往返工作了。

Visual Studio 2010 SP1 包含了支持项目往返切换的框架。据 Visual Studio 博客上说,

在 Visual Studio 2010 中,我们启用了完整的多目标支持,用于服务 Visual Studio 与 .NET 运行时之间的一对一支持。它可以让 Visual Studio 2010 中创建的项目定向到老版本的 .NET Framework,这推进了我们启用 Visual Studio 项目在不同版本之间的往返切换的脚步。在 Visual Studio 11 中,我们自然而然地迈出了另一步,正确处理不同环境下的项目。

在使用往返切换功能之前,需要了解的重要事项是此类项目仅向后兼容 Visual Studio 2010 SP1,并且应用程序必须目标定向为 .NET Framework 2-4。兼容性同样根据项目类型的不同而有所不同,有一些项目是完全不可行的。(微软已经提供了一份包含兼容性细节的清单。)

项目行为

微软声明说,大部分项目在 Visual Studio 2010 SP1 与 2012 中的行为一致,从而往返切换没有问题。对于在构建路径上使用硬编码版本号的项目,它们中的版本号会自动更新为变量进行替代,所有的改动就仅限于此。应当可以无缝进行往返切换的项目类型有:Windows Forms、Sharepoint、WPF 以及大部分 SQL Server 项目。

其他项目也可以自动升级用于支持往返切换。Visual Studio 2012 在项目打开时,会显示一个”检查项目及解决方案改动“的对话框并显示影响的条目。用户可以在升级发生前检查提到的改动,之后过程会创建一个备份。一旦 Visual Studio 2012 执行修改后,项目就可以同时在 2012 与 2010 SP1 中使用了。Silverlight 4 与5、Blend 和 Visual Studio 2010 Web 项目也属于此类。

特定类型的项目在升级后的行为与此前的 Visual Studio 一样:一旦它们被转换后,将不能在任何其他版本的 Visual Studio 中使用。这些项目类型包括F#、LightSwitch 以及 SQL Server LocalDB。

不在此列的项目

Windows Phone、Windows Mobile、Windows Azure 云工具、BizTalk 2010 R2 以及 Visual Studio 安装程序(*.msi)项目没法在 Visual Studio 2012 RC 中使用。微软对是否在最终版本中为上述类型的项目提供往返切换支持尚未说明。对于安装程序项目,微软鼓励开发人员使用 InstallShield Limited Edition for Visual Studio 进行替代。

使用AppHarbor部署.NET项目

最近比较闲,于是打算折腾一下云计算啥的。云平台,Ruby有Heroku, PHP有Phpfog以及DotClound等等,而.NET除了微软那个贵而且难用的Azure外,一直没有一个适合开发者的实验平台,不过AppHarbor改变了这一点。
自动化单元测试,15秒部署,以及Git管理,这都是AppHarbor优秀的地方。和其他平台类似,你可以免费使用一个Instance,以及20M的SQL Server数据库。这些对初学者来说应该足够了(话说以前免费用户没有按流量收费,并且可以自定义域名,当然现在都没有了……)
一、部署AppHarbor的准备
1、AppHarbor账户。去AppHarbor注册即可;
2、完整的项目。想体验下的可以直接用VS的演示项目;
3、 Git。了解基本操作即可;
4、Github,可选。AppHarbor可以Hook你的Github帐号,当然你也可以不使用。
二、Application设置
1、注册AppHarbor后,在页面Create new application,然后进入你刚刚创建的Application,选择setting,设置Application Name和Tracking branch。Tracking branch就是你用来推送的分支,我们选择master。
2、添加Sql Server数据库。点击Add-on,在页面最下方中找到 SQL Server,选择see more,Install Free Yocto。
三、配置项目
1、在Application页面找到刚安装的SQL Server Add-on,选择Go to SQL Server,会打开一个关于数据库连接的详细界面。将其中的Connection string配置到项目的web.config文件中。可以通过web.config transform来让debug版本和release版本保持不同的设置,以免每次发布都要修改。如果你不确定自己的设置是否正确,可以在这里检查你的web.config transformation。
2、将本地数据库复制到给定的数据库。你可以在刚才的页面中找到数据库的Host,Username 和Password。
四、发布到AppHarbor
1、 在Application页面找到Repository URL,点击它会自动复制Repository URL到剪贴板,形如

https://[yourusername]@appharbor.com/[yourapplicationname].git。
   2、使用Git发布到AppHarbor。首先建立Repository,然后commit,并添加AppHarbor的remote,最后Push即可。大致过程如下:
git init
git commit -m "first commit"
git remote add appharbor https://[yourusername]@appharbor.com/[yourapplicationname].git
git push appharbor master
过程中会提示输入AppHarbor密码。
3、Push成功后,刷新你的Application页面,可以看到正在Build,Build完成之后会显示一个Commit 和 Build Status。点击当前的Build Status可以下载到AppHarbor Build的项目版本。
4、点击“Go to your application”即可访问你的Application了。
五、运行失败?
如果出现运行失败,处于安全考虑,可能AppHarbor不会完全显示详细的错误信息,这个时候就需要对错误进行排查。
1、确定本地编译成功;可以在本地服务器运行,但是在AppHarbor上出错,首先检查web.config文件的配置是否正确;
2、若web.config配置正确,可以看Sql Server中的数据是否正确;
3、Application页面中提供了Errors选项;
4、下载AppHarbor编译的版本,然后在本地run,查看出错的地方。