[{"data":1,"prerenderedAt":2127},["ShallowReactive",2],{"navigation":3,"posts-undefined-.NET-0-999":20},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",[21,109,302,867,1196,1368,1428,1467,1495,1673,1705,1860],{"id":22,"title":23,"body":24,"class":89,"cover":89,"coverSize":89,"date":90,"description":91,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":94,"navigation":95,"path":96,"readingTime":97,"seo":102,"sitemap":103,"stem":104,"tags":105,"time":89,"weather":89,"__hash__":108},"posts\u002Fposts\u002F2016\u002F20161208.asp-net-core-ef-sqlite-add-foreign-key-to-exist-table.md","Entity Framework Core SQLite provider 向已存在的表中添加外键",{"type":25,"value":26,"toc":85},"minimark",[27,39,42,45,48,51,82],[28,29,30,31,38],"p",{},"SQLite 本身不支持向已创建的表中添加外键，类似的限制还有很多，比较蛋疼，具体可以参见",[32,33,37],"a",{"href":34,"rel":35},"https:\u002F\u002Fdocs.microsoft.com\u002Fen-us\u002Fef\u002Fcore\u002Fproviders\u002Fsqlite\u002Flimitations",[36],"nofollow","SQLite Limitations","。",[28,40,41],{},"项目中，如果是测试的时候，数据不是很重要的话，最方便的方法就是把已经创建的 Migrations 包括 ModelSnapshot 都删掉，重新 Add-Migration 重建数据库。",[28,43,44],{},"对于已经发布的应用，数据库不能删了创建的话，可以“曲线救国”。",[28,46,47],{},"假设需要给 TableA 添加一个需要建立外键的字段 ColumnA，为了增加难度，假设 TableB 中的 Column",[28,49,50],{},"B 是 TableA 的外键。具体操作方法如下：",[52,53,54,58,61,64,67,70,73,76,79],"ol",{},[55,56,57],"li",{},"先在代码中 TableA 里添加 ColumnA（不设置外键），Add-Migration，更新到线上数据库",[55,59,60],{},"将本地的数据库改名为 database-backup，删除项目中所有 Migrations 和 ModelSnapshot，创建一个 RebuildDatabase 的 Migration，创建全新的数据库，从新数据库中复制 TableA 的 Create Statement SQL 语句并将改 SQL 语句中的表名改为 TableA-New",[55,62,63],{},"在线上数据库中执行步骤 2 中的 SQL 语句，将创建 TableA-New（已经含有外键约束了）",[55,65,66],{},"导出线上数据库中 TableA 中的数据到 SQL 文件中，并将该 SQL 文件中的表名改为 TableA-New",[55,68,69],{},"将步骤 4 中的 SQL 文件的数据导入到线上数据库中",[55,71,72],{},"将线上数据库的 TableA 改名为 TableA-Old，将 TableA-New 改名为 TableA",[55,74,75],{},"因为重命名的关系，这时候 TableB 中的 ColumnB 是 TableA-Old 的外键，通过如下方法，将 TableB 中的外键约束改到 TableA 中：复制 TableB 的 Create Statement，创建一个 TableB-New，其中的 ColumnB 是 TableA 的外键，然后将 TableB 改名为 TableB-Old，并将 TableB-New 改名为 TableB（如果还有 TableC 中有 TableB-Old 的外键，通过同样的方法操作，以此类推），删除 TableB-Old。（如果没有这样的 TableB，则此步骤省略）",[55,77,78],{},"删除 TableAOld",[55,80,81],{},"清空线上数据库__EFMigrationHistory 表中的数据，并手动添加一条数据，以 RebuildDatabase 的 Migration 的文件名作为 MigrationId，并输入当前的 ProductVersion",[28,83,84],{},"收工！",{"title":86,"searchDepth":87,"depth":87,"links":88},"",2,[],null,"2016-12-08","SQLite 本身不支持向已创建的表中添加外键，类似的限制还有很多，比较蛋疼，具体可以参见SQLite Limitations。",false,"md",{},true,"\u002Fposts\u002F2016\u002Fasp-net-core-ef-sqlite-add-foreign-key-to-exist-table",{"text":98,"minutes":99,"time":100,"words":101},"3 min read",2.535,152100,507,{"title":23,"description":91},{"loc":96},"posts\u002F2016\u002F20161208.asp-net-core-ef-sqlite-add-foreign-key-to-exist-table",[106,107],"技术",".NET","_hu7m8FKjqaeMscDcXPApg4_4iD34-7HKcNatqV5v3o",{"id":110,"title":111,"body":112,"class":89,"cover":89,"coverSize":89,"date":289,"description":116,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":290,"navigation":95,"path":291,"readingTime":292,"seo":297,"sitemap":298,"stem":299,"tags":300,"time":89,"weather":89,"__hash__":301},"posts\u002Fposts\u002F2016\u002F20161023.upgrade-to-net-core-app-1-0-1-problem.md","更新 Microsoft.NETCore.App 到 1.0.1 出现 502.5 错误的问题",{"type":25,"value":113,"toc":287},[114,117,120,123,126,222,229,259,268,283],[28,115,116],{},"今天白天遇到一个问题，花了很长时间才解决。记录下。",[28,118,119],{},"问题是这样的，我是个强迫症，如果发现有可以更新的包，我肯定会去更新。",[28,121,122],{},"新建了一个 ASP.NET Core 的 Api 项目，发现有包可以更新，于是通过 Nuget 自动更新。更新完之后，出现第一个坑。",[28,124,125],{},"原先的",[127,128,132],"pre",{"className":129,"code":130,"language":131,"meta":86,"style":86},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"Microsoft.NETCore.App\": {\n    \"version\": \"1.0.0\",\n    \"type\": \"platform\"\n  }\n}\n","json",[133,134,135,144,163,190,210,216],"code",{"__ignoreMap":86},[136,137,140],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"sP7_E","{\n",[136,145,146,150,154,157,160],{"class":138,"line":87},[136,147,149],{"class":148},"s39Yj","  \"",[136,151,153],{"class":152},"sseR_","Microsoft.NETCore.App",[136,155,156],{"class":148},"\"",[136,158,159],{"class":142},":",[136,161,162],{"class":142}," {\n",[136,164,166,169,173,175,177,181,185,187],{"class":138,"line":165},3,[136,167,168],{"class":148},"    \"",[136,170,172],{"class":171},"sZMiF","version",[136,174,156],{"class":148},[136,176,159],{"class":142},[136,178,180],{"class":179},"sjJ54"," \"",[136,182,184],{"class":183},"s_sjI","1.0.0",[136,186,156],{"class":179},[136,188,189],{"class":142},",\n",[136,191,193,195,198,200,202,204,207],{"class":138,"line":192},4,[136,194,168],{"class":148},[136,196,197],{"class":171},"type",[136,199,156],{"class":148},[136,201,159],{"class":142},[136,203,180],{"class":179},[136,205,206],{"class":183},"platform",[136,208,209],{"class":179},"\"\n",[136,211,213],{"class":138,"line":212},5,[136,214,215],{"class":142},"  }\n",[136,217,219],{"class":138,"line":218},6,[136,220,221],{"class":142},"}\n",[28,223,224,225,228],{},"更新之后会丢失 ",[133,226,227],{},"\"type\": \"platform\"","，变成",[127,230,232],{"className":129,"code":231,"language":131,"meta":86,"style":86},"{\n  \"Microsoft.NETCore.App\": \"1.0.1\"\n}\n",[133,233,234,238,255],{"__ignoreMap":86},[136,235,236],{"class":138,"line":139},[136,237,143],{"class":142},[136,239,240,242,244,246,248,250,253],{"class":138,"line":87},[136,241,149],{"class":148},[136,243,153],{"class":152},[136,245,156],{"class":148},[136,247,159],{"class":142},[136,249,180],{"class":179},[136,251,252],{"class":183},"1.0.1",[136,254,209],{"class":179},[136,256,257],{"class":138,"line":165},[136,258,221],{"class":142},[28,260,261,262,264,265,267],{},"直接编译都会报错。这个好解决，自己手动改下。把 ",[133,263,172],{}," 和 ",[133,266,197],{}," 加上。",[28,269,270,271,276,277,282],{},"改好之后，编译不报错了，但是在 iis express 上运行的时候，会出现 502.5 的错误，百思不得其解。Google 了很长时间也没找到解决方案。后来猛然在 ",[32,272,275],{"href":273,"rel":274},"https:\u002F\u002Fwww.microsoft.com\u002Fnet\u002Fcore#windows",[36],".NET Core 首页"," 的 Install .NET Core SDK 中看到一个 ",[32,278,281],{"href":279,"rel":280},"https:\u002F\u002Fgo.microsoft.com\u002Ffwlink\u002F?LinkID=827546",[36],".NET Core 1.0.1 - VS 2015 Tooling Preview 2","，突然感觉是不是还得安装下这个更新才能用.NET Core 1.0.1，于是下载更新，问题解决。",[284,285,286],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":86,"searchDepth":87,"depth":87,"links":288},[],"2016-10-23",{},"\u002Fposts\u002F2016\u002Fupgrade-to-net-core-app-1-0-1-problem",{"text":293,"minutes":294,"time":295,"words":296},"2 min read",1.225,73500,245,{"title":111,"description":116},{"loc":291},"posts\u002F2016\u002F20161023.upgrade-to-net-core-app-1-0-1-problem",[106,107],"3ymDoxvUSQNkTj9e34yl6hn703dFuShJVtfnlufSXxg",{"id":303,"title":304,"body":305,"class":89,"cover":89,"coverSize":89,"date":854,"description":86,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":855,"navigation":95,"path":856,"readingTime":857,"seo":862,"sitemap":863,"stem":864,"tags":865,"time":89,"weather":89,"__hash__":866},"posts\u002Fposts\u002F2016\u002F20161017.publishing-asp-net-core-to-iis-with-web-deploy-using-visual-studio.md","使用 Visual Studio Web Deploy 发布 ASP.NET Core 至 IIS",{"type":25,"value":306,"toc":852},[307,311,320,324,327,331,352,360,363,378,477,483,487,490,534,581,585,588,591,677,681,684,695,698,714,729,733,744,747,755,764,767,776,780,783,786,833,836,849],[308,309,310],"h4",{"id":310},"操作系统要求",[312,313,314,317],"ul",{},[55,315,316],{},"Windows 7 及以上",[55,318,319],{},"Windows Server 2008 R2 及以上",[308,321,323],{"id":322},"iis-配置","IIS 配置",[28,325,326],{},"在服务器管理器中，通过添加角色和功能的向导，在服务器角色中勾选 Web 服务器（IIS），并安装。",[308,328,330],{"id":329},"安装net-core-windows-server-hosting-包","安装.NET Core Windows Server Hosting 包",[52,332,333,342],{},[55,334,335,336,341],{},"安装",[32,337,340],{"href":338,"rel":339},"https:\u002F\u002Fgo.microsoft.com\u002Ffwlink\u002F?LinkID=827547",[36],".NET Core Windows Server Hosting","，这个包会安装.NET Core 运行时、.NET Core 库和 ASP.NET Core 模块，这个模块会在 IIS 和 Kestrel 服务器之间创建反向代理。",[55,343,344,345,348,349,38],{},"重启服务器，或者从命令行执行",[133,346,347],{},"net stop was \u002Fy","，接着执行",[133,350,351],{},"net start w3svc",[28,353,354,355,38],{},"更多关于 ASP.NET Core 模块以及针对该模块的配置、web.config 中系统变量的设置、app_ofline.htm 的使用、模块日志的激活等，请参阅",[32,356,359],{"href":357,"rel":358},"https:\u002F\u002Fdocs.asp.net\u002Fen\u002Flatest\u002Fhosting\u002Faspnet-core-module.html",[36],"ASP.NET Core Module Configuration Reference",[308,361,362],{"id":362},"应用程序配置",[28,364,365,366,369,370,373,374,377],{},"添加对",[133,367,368],{},"Microsoft.AspNetCore.Server.IISIntegration","包的依赖，添加",[133,371,372],{},".UseIISIntegration()","到",[133,375,376],{},"WebHostBuilder()","中以引入 IIS 集成中间件。",[127,379,383],{"className":380,"code":381,"language":382,"meta":86,"style":86},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","var host = new WebHostBuilder()\n  .UseKestrel()\n  .UseContentRoot(Directory.GetCurrentDirectory())\n  .UseIISIntegration()\n  .UseStartup\u003CStartup>()\n  .Build();\n","csharp",[133,384,385,408,419,442,451,467],{"__ignoreMap":86},[136,386,387,391,395,399,402,405],{"class":138,"line":139},[136,388,390],{"class":389},"sG8yY","var",[136,392,394],{"class":393},"sbgvK"," host",[136,396,398],{"class":397},"smGrS"," =",[136,400,401],{"class":397}," new",[136,403,404],{"class":393}," WebHostBuilder",[136,406,407],{"class":142},"()\n",[136,409,410,413,417],{"class":138,"line":87},[136,411,412],{"class":142},"  .",[136,414,416],{"class":415},"sGLFI","UseKestrel",[136,418,407],{"class":142},[136,420,421,423,426,429,433,436,439],{"class":138,"line":165},[136,422,412],{"class":142},[136,424,425],{"class":415},"UseContentRoot",[136,427,428],{"class":142},"(",[136,430,432],{"class":431},"su5hD","Directory",[136,434,435],{"class":142},".",[136,437,438],{"class":415},"GetCurrentDirectory",[136,440,441],{"class":142},"())\n",[136,443,444,446,449],{"class":138,"line":192},[136,445,412],{"class":142},[136,447,448],{"class":415},"UseIISIntegration",[136,450,407],{"class":142},[136,452,453,455,458,461,464],{"class":138,"line":212},[136,454,412],{"class":142},[136,456,457],{"class":415},"UseStartup",[136,459,460],{"class":142},"\u003C",[136,462,463],{"class":393},"Startup",[136,465,466],{"class":142},">()\n",[136,468,469,471,474],{"class":138,"line":218},[136,470,412],{"class":142},[136,472,473],{"class":415},"Build",[136,475,476],{"class":142},"();\n",[28,478,479,480,482],{},"需要指出的是，添加",[133,481,372],{},"并不会影响代码的可移植性。",[308,484,486],{"id":485},"为-iisintegration-服务设置-iisoptions","为 IISIntegration 服务设置 IISOptions",[28,488,489],{},"为了配置 IISIntegration 服务，需要在 ConfigureServices 中为 IISOptions 添加服务器配置。",[127,491,493],{"className":380,"code":492,"language":382,"meta":86,"style":86},"services.Configure\u003CIISOptions>(options => {\n  ...\n});\n",[133,494,495,521,529],{"__ignoreMap":86},[136,496,497,500,502,505,507,510,513,516,519],{"class":138,"line":139},[136,498,499],{"class":431},"services",[136,501,435],{"class":142},[136,503,504],{"class":415},"Configure",[136,506,460],{"class":142},[136,508,509],{"class":393},"IISOptions",[136,511,512],{"class":142},">(",[136,514,515],{"class":393},"options",[136,517,518],{"class":397}," =>",[136,520,162],{"class":142},[136,522,523,526],{"class":138,"line":87},[136,524,525],{"class":397},"  ..",[136,527,528],{"class":431},".\n",[136,530,531],{"class":138,"line":165},[136,532,533],{"class":142},"});\n",[535,536,537],"scrollable-table",{},[538,539,540,553],"table",{},[541,542,543],"thead",{},[544,545,546,550],"tr",{},[547,548,549],"th",{},"Option",[547,551,552],{},"Setting",[554,555,556,565,573],"tbody",{},[544,557,558,562],{},[559,560,561],"td",{},"AutomaticAuthentication",[559,563,564],{},"If true, the authentication middleware will alter the request user arriving and respond to generic challenges. If false, the authentication middleware will only provide identity and respond to challenges when explicitly indicated by the AuthenticationScheme.",[544,566,567,570],{},[559,568,569],{},"ForwardClientCertificate",[559,571,572],{},"If true and the MS-ASPNETCORE-CLIENTCERT request header is present, the ITLSConnectionFeature will be populated.",[544,574,575,578],{},[559,576,577],{},"ForwardWindowsAuthentication",[559,579,580],{},"If true, authentication middleware will attempt to authenticate using platform handler windows authentication. If false, authentication middleware won’t be added.",[308,582,584],{"id":583},"publish-iis-工具","publish-iis 工具",[28,586,587],{},"The publish-iis tool can be added to any .NET Core application and will configure the ASP.NET Core Module by creating or modifying the web.config file. The tool runs after publishing with the dotnet publish command or publishing with Visual Studio and will configure the processPath and arguments for you. If you’re publishing a web.config file by including the file in your project and listing the file in the publishOptions section of project.json, the tool will not modify other IIS settings you have included in the file.",[28,589,590],{},"To include the publish-iis tool in your application, add entries to the tools and scripts sections of project.json.",[127,592,594],{"className":129,"code":593,"language":131,"meta":86,"style":86},"{\n  \"tools\": {\n    \"Microsoft.AspNetCore.Server.IISIntegration.Tools\": \"1.0.0-preview2-final\"\n  },\n  \"scripts\": {\n    \"postpublish\": \"dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%\"\n  }\n}\n",[133,595,596,600,613,631,636,649,667,672],{"__ignoreMap":86},[136,597,598],{"class":138,"line":139},[136,599,143],{"class":142},[136,601,602,604,607,609,611],{"class":138,"line":87},[136,603,149],{"class":148},[136,605,606],{"class":152},"tools",[136,608,156],{"class":148},[136,610,159],{"class":142},[136,612,162],{"class":142},[136,614,615,617,620,622,624,626,629],{"class":138,"line":165},[136,616,168],{"class":148},[136,618,619],{"class":171},"Microsoft.AspNetCore.Server.IISIntegration.Tools",[136,621,156],{"class":148},[136,623,159],{"class":142},[136,625,180],{"class":179},[136,627,628],{"class":183},"1.0.0-preview2-final",[136,630,209],{"class":179},[136,632,633],{"class":138,"line":192},[136,634,635],{"class":142},"  },\n",[136,637,638,640,643,645,647],{"class":138,"line":212},[136,639,149],{"class":148},[136,641,642],{"class":152},"scripts",[136,644,156],{"class":148},[136,646,159],{"class":142},[136,648,162],{"class":142},[136,650,651,653,656,658,660,662,665],{"class":138,"line":218},[136,652,168],{"class":148},[136,654,655],{"class":171},"postpublish",[136,657,156],{"class":148},[136,659,159],{"class":142},[136,661,180],{"class":179},[136,663,664],{"class":183},"dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%",[136,666,209],{"class":179},[136,668,670],{"class":138,"line":669},7,[136,671,215],{"class":142},[136,673,675],{"class":138,"line":674},8,[136,676,221],{"class":142},[308,678,680],{"id":679},"web-deploy-配置","Web Deploy 配置",[28,682,683],{},"第一步需要确保你的服务器支持 ASP.NET Core，必要的条件是：",[52,685,686,689,692],{},[55,687,688],{},"安装了 IIS 7.5+",[55,690,691],{},"安装了 HttpPlatformHandler",[55,693,694],{},"安装了 Web Deploy v3.6",[28,696,697],{},"HttpPlatformHandler 是一个新的组件，用来连接 IIS 和 ASP.NET Core 应用程序，下载链接如下：",[312,699,700,707],{},[55,701,702],{},[32,703,706],{"href":704,"rel":705},"http:\u002F\u002Fgo.microsoft.com\u002Ffwlink\u002F?LinkID=690721",[36],"64 位下载地址",[55,708,709],{},[32,710,713],{"href":711,"rel":712},"http:\u002F\u002Fgo.microsoft.com\u002Ffwlink\u002F?LinkId=690722",[36],"32 位下载地址",[28,715,716,717,722,723,728],{},"安装 HttpPlatformHandler 之前，需要先安装 Web Deploy v3.6，可以通过",[32,718,721],{"href":719,"rel":720},"https:\u002F\u002Fwww.microsoft.com\u002Fweb\u002Fdownloads\u002Fplatform.aspx",[36],"Web Platform Installer","（WebPI），或者直接从",[32,724,727],{"href":725,"rel":726},"https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fdownload\u002Fdetails.aspx?id=43717",[36],"下载中心","下载，不过推荐通过 WebPI 的方式下载，它提供了独立的安装并且包含了一些必要的配置。",[308,730,732],{"id":731},"在-iis-中配置站点","在 IIS 中配置站点",[52,734,735,738,741],{},[55,736,737],{},"在 IIS 管理器中新建一个网站，输入网站名、物理地址以及域名绑定的配置。",[55,739,740],{},"设置应用程序池的.NET CLR 版本为无托管代码。",[55,742,743],{},"右键网站->部署->启用 Web Deploy 发布...，会在桌面生成一个.PublishSettings 后缀的配置文件，复制出来，后续操作中需要导入到 Visual Studio 中。",[308,745,746],{"id":746},"配置数据保护",[28,748,749,750,38],{},"为了持久化数据保护的密钥，你必须为每个应用程序池创建注册表存储单元来存储这些密钥。需要为每个 ASP.NET Core 应用程序池执行这个 PowerShell 脚本",[32,751,754],{"href":752,"rel":753},"https:\u002F\u002Fgithub.com\u002Faspnet\u002FDataProtection\u002Fblob\u002Fdev\u002FProvision-AutoGenKeys.ps1",[36],"Provisioning PowerShell",[28,756,757,758,763],{},"For web farm scenarios developers can configure their applications to use a UNC path to store the data protection key ring. By default this does not encrypt the key ring. You can deploy an x509 certificate to each machine and use that to encrypt the keyring. See the ",[32,759,762],{"href":760,"rel":761},"https:\u002F\u002Fdocs.asp.net\u002Fen\u002Flatest\u002Fsecurity\u002Fdata-protection\u002Fconfiguration\u002Foverview.html#data-protection-configuring",[36],"configuration APIs"," for more details.",[28,765,766],{},"Warning: Data Protection is used by various ASP.NET middlewares, including those used in authentication. Even if you do not specifically call any Data Protection APIs from your own code you should configure Data Protection with the deployment script or in your own code. If you do not configure data protection when using IIS by default the keys will be held in memory and discarded when your application closes or restarts. This will then, for example, invalidate any cookies written by the cookie authentication and users will have to login again.",[28,768,769,770,775],{},"关于配置 IIS，可以前往",[32,771,774],{"href":772,"rel":773},"https:\u002F\u002Fdocs.asp.net\u002Fen\u002Flatest\u002Fpublishing\u002Fiis.html",[36],"Publishing to IIS","查看更多详情。下面我们来看看 Visual Studio 中的步骤。",[308,777,779],{"id":778},"通过-visual-studio-发布","通过 Visual Studio 发布",[28,781,782],{},"在配置好服务器之后，下一步就是在 Visual Studio 中创建一个发布配置文件。将 ASP.NET Core 应用程序发布到标准的 IIS 服务器上最简单的方法就是使用发布配置文件。如果你的服务器支持创建发布配置文件，可以下载过来，然后在 Visual Studio 发布对话框中导入进来。",[28,784,785],{},"如果发现使用 Web Deploy 无法部署，可能是由于数据保护没有配置好，也可以不配置，在 pubxml 中添加如下两行：",[127,787,791],{"className":788,"code":789,"language":790,"meta":86,"style":86},"language-xml shiki shiki-themes material-theme-lighter github-light github-dark","\u003CAllowUntrustedCertificate>True\u003C\u002FAllowUntrustedCertificate>\n\u003CUsePowerShell>False\u003C\u002FUsePowerShell>\n","xml",[133,792,793,815],{"__ignoreMap":86},[136,794,795,797,801,804,807,810,812],{"class":138,"line":139},[136,796,460],{"class":142},[136,798,800],{"class":799},"sQzsp","AllowUntrustedCertificate",[136,802,803],{"class":142},">",[136,805,806],{"class":431},"True",[136,808,809],{"class":142},"\u003C\u002F",[136,811,800],{"class":799},[136,813,814],{"class":142},">\n",[136,816,817,819,822,824,827,829,831],{"class":138,"line":87},[136,818,460],{"class":142},[136,820,821],{"class":799},"UsePowerShell",[136,823,803],{"class":142},[136,825,826],{"class":431},"False",[136,828,809],{"class":142},[136,830,821],{"class":799},[136,832,814],{"class":142},[308,834,835],{"id":835},"参考链接",[312,837,838,843],{},[55,839,840],{},[32,841,772],{"href":772,"rel":842},[36],[55,844,845],{},[32,846,847],{"href":847,"rel":848},"https:\u002F\u002Fdocs.asp.net\u002Fen\u002Flatest\u002Fpublishing\u002Fiis-with-msdeploy.html",[36],[284,850,851],{},"html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":86,"searchDepth":87,"depth":87,"links":853},[],"2016-10-17",{},"\u002Fposts\u002F2016\u002Fpublishing-asp-net-core-to-iis-with-web-deploy-using-visual-studio",{"text":858,"minutes":859,"time":860,"words":861},"6 min read",5.425,325500,1085,{"title":304,"description":86},{"loc":856},"posts\u002F2016\u002F20161017.publishing-asp-net-core-to-iis-with-web-deploy-using-visual-studio",[106,107],"3ExP9FCefv35aQIisudcgyfLdozLzz3J85Pq1SD6g4U",{"id":868,"title":869,"body":870,"class":89,"cover":89,"coverSize":89,"date":1184,"description":874,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":1185,"navigation":95,"path":1186,"readingTime":1187,"seo":1191,"sitemap":1192,"stem":1193,"tags":1194,"time":89,"weather":89,"__hash__":1195},"posts\u002Fposts\u002F2016\u002F20160731.bad-request-invalid-hostname.md","“Bad Request - Invalid Hostname” 的解决办法",{"type":25,"value":871,"toc":1182},[872,875,885,892,895,926,937,1145,1159,1173,1176,1179],[28,873,874],{},"最近在做一个微信端的应用，除了在本地测试之外，有时候还需要在手机上进行测试。",[28,876,877,878,881,882,38],{},"假设我的手机和 PC 在同一内网内，PC 的 IP 是",[133,879,880],{},"192.168.1.2","，Website 的端口是",[133,883,884],{},"12345",[28,886,887,888,891],{},"我的第一反应是，我应该在手机上通过",[133,889,890],{},"http:\u002F\u002F192.168.1.2:12345","来访问我的站点。",[28,893,894],{},"然而，我得到了这样一个错误：",[127,896,900],{"className":897,"code":898,"language":899,"meta":86,"style":86},"language-log shiki shiki-themes material-theme-lighter github-light github-dark","Bad Request - Invalid Hostname\n------------------------------------------------\nHTTP Error 400. The request hostname is invalid.\n","log",[133,901,902,907,912],{"__ignoreMap":86},[136,903,904],{"class":138,"line":139},[136,905,906],{"class":431},"Bad Request - Invalid Hostname\n",[136,908,909],{"class":138,"line":87},[136,910,911],{"class":431},"------------------------------------------------\n",[136,913,914,917,920,923],{"class":138,"line":165},[136,915,916],{"class":431},"HTTP ",[136,918,919],{"class":183},"Error",[136,921,922],{"class":148}," 400",[136,924,925],{"class":431},". The request hostname is invalid.\n",[28,927,928,929,932,933,936],{},"方法很简单，Visual Studio 2015 的项目目录中会有一个",[133,930,931],{},".vs","的文件夹，打开",[133,934,935],{},".vs\\config\\applicationhost.config","，找到目标站点的配置节点，例如：",[127,938,940],{"className":788,"code":939,"language":790,"meta":86,"style":86},"\u003Csite name=\"Demo.Website\" id=\"2\">\n    \u003Capplication path=\"\u002F\" applicationPool=\"Clr4IntegratedAppPool\">\n        \u003CvirtualDirectory path=\"\u002F\" physicalPath=\"D:\\Projects\\Demo\\Demo.Website\" \u002F>\n    \u003C\u002Fapplication>\n    \u003Cbindings>\n        \u003Cbinding protocol=\"http\" bindingInformation=\"*:52945:localhost\" \u002F>\n        \u003Cbinding protocol=\"http\" bindingInformation=\"*:52945:*\" \u002F> \u003C!-- 加上这一行 -->\n    \u003C\u002Fbindings>\n\u003C\u002Fsite>\n",[133,941,942,977,1010,1043,1052,1061,1094,1128,1136],{"__ignoreMap":86},[136,943,944,946,949,953,956,958,961,963,966,968,970,973,975],{"class":138,"line":139},[136,945,460],{"class":142},[136,947,948],{"class":799},"site",[136,950,952],{"class":951},"s9AJx"," name",[136,954,955],{"class":142},"=",[136,957,156],{"class":179},[136,959,960],{"class":183},"Demo.Website",[136,962,156],{"class":179},[136,964,965],{"class":951}," id",[136,967,955],{"class":142},[136,969,156],{"class":179},[136,971,972],{"class":183},"2",[136,974,156],{"class":179},[136,976,814],{"class":142},[136,978,979,982,985,988,990,992,994,996,999,1001,1003,1006,1008],{"class":138,"line":87},[136,980,981],{"class":142},"    \u003C",[136,983,984],{"class":799},"application",[136,986,987],{"class":951}," path",[136,989,955],{"class":142},[136,991,156],{"class":179},[136,993,6],{"class":183},[136,995,156],{"class":179},[136,997,998],{"class":951}," applicationPool",[136,1000,955],{"class":142},[136,1002,156],{"class":179},[136,1004,1005],{"class":183},"Clr4IntegratedAppPool",[136,1007,156],{"class":179},[136,1009,814],{"class":142},[136,1011,1012,1015,1018,1020,1022,1024,1026,1028,1031,1033,1035,1038,1040],{"class":138,"line":165},[136,1013,1014],{"class":142},"        \u003C",[136,1016,1017],{"class":799},"virtualDirectory",[136,1019,987],{"class":951},[136,1021,955],{"class":142},[136,1023,156],{"class":179},[136,1025,6],{"class":183},[136,1027,156],{"class":179},[136,1029,1030],{"class":951}," physicalPath",[136,1032,955],{"class":142},[136,1034,156],{"class":179},[136,1036,1037],{"class":183},"D:\\Projects\\Demo\\Demo.Website",[136,1039,156],{"class":179},[136,1041,1042],{"class":142}," \u002F>\n",[136,1044,1045,1048,1050],{"class":138,"line":192},[136,1046,1047],{"class":142},"    \u003C\u002F",[136,1049,984],{"class":799},[136,1051,814],{"class":142},[136,1053,1054,1056,1059],{"class":138,"line":212},[136,1055,981],{"class":142},[136,1057,1058],{"class":799},"bindings",[136,1060,814],{"class":142},[136,1062,1063,1065,1068,1071,1073,1075,1078,1080,1083,1085,1087,1090,1092],{"class":138,"line":218},[136,1064,1014],{"class":142},[136,1066,1067],{"class":799},"binding",[136,1069,1070],{"class":951}," protocol",[136,1072,955],{"class":142},[136,1074,156],{"class":179},[136,1076,1077],{"class":183},"http",[136,1079,156],{"class":179},[136,1081,1082],{"class":951}," bindingInformation",[136,1084,955],{"class":142},[136,1086,156],{"class":179},[136,1088,1089],{"class":183},"*:52945:localhost",[136,1091,156],{"class":179},[136,1093,1042],{"class":142},[136,1095,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1119,1121,1124],{"class":138,"line":669},[136,1097,1014],{"class":142},[136,1099,1067],{"class":799},[136,1101,1070],{"class":951},[136,1103,955],{"class":142},[136,1105,156],{"class":179},[136,1107,1077],{"class":183},[136,1109,156],{"class":179},[136,1111,1082],{"class":951},[136,1113,955],{"class":142},[136,1115,156],{"class":179},[136,1117,1118],{"class":183},"*:52945:*",[136,1120,156],{"class":179},[136,1122,1123],{"class":142}," \u002F>",[136,1125,1127],{"class":1126},"sutJx"," \u003C!-- 加上这一行 -->\n",[136,1129,1130,1132,1134],{"class":138,"line":674},[136,1131,1047],{"class":142},[136,1133,1058],{"class":799},[136,1135,814],{"class":142},[136,1137,1139,1141,1143],{"class":138,"line":1138},9,[136,1140,809],{"class":142},[136,1142,948],{"class":799},[136,1144,814],{"class":142},[28,1146,1147,1148,1151,1152,1155,1156,1158],{},"网上大部分教程基本就说了这么多，然而我在这样配置了之后依然有问题。甚至有些教程是直接把",[133,1149,1150],{},"localhost","改成了",[133,1153,1154],{},"*","，也可以理解。然而，我每次这么做之后，重新启动站点的时候，总是会自动重新生成一个节点，那个里面配置的是",[133,1157,1150],{},"。纠结了一下午。",[28,1160,1161,1162,1164,1165,1169,1170,1172],{},"最后发现是权限的问题，如果想配置非",[133,1163,1150],{},"的绑定，VS 必须以",[1166,1167,1168],"strong",{},"管理员权限","运行才行。这样如果只配置了非",[133,1171,1150],{},"的绑定，就不会新建了，或者配置多条绑定也可以生效了。",[28,1174,1175],{},"遇到这个问题一直解决不了的朋友可以参考下。",[28,1177,1178],{},"另外如果站点甚至无法访问的话，可以新建一条防火墙入站规则，把端口号配置进去。",[284,1180,1181],{},"html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}",{"title":86,"searchDepth":87,"depth":87,"links":1183},[],"2016-07-31",{},"\u002Fposts\u002F2016\u002Fbad-request-invalid-hostname",{"text":293,"minutes":1188,"time":1189,"words":1190},1.93,115800,386,{"title":869,"description":874},{"loc":1186},"posts\u002F2016\u002F20160731.bad-request-invalid-hostname",[106,107],"5Oytl4Q6T2ls3lm_J5MjkIk3EFeaQ6vcO3BRUtaNHHA",{"id":1197,"title":1198,"body":1199,"class":89,"cover":89,"coverSize":89,"date":1355,"description":1203,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":1356,"navigation":95,"path":1357,"readingTime":1358,"seo":1363,"sitemap":1364,"stem":1365,"tags":1366,"time":89,"weather":89,"__hash__":1367},"posts\u002Fposts\u002F2016\u002F20160721.asp-net-core-first-experience.md","ASP.NET Core 初体验",{"type":25,"value":1200,"toc":1353},[1201,1204,1224,1239,1242,1260,1263,1300,1336,1350],[28,1202,1203],{},"前两天试了下 ASP.NET Core MVC，很好用。微软整合了大量前端工具，npm、Bower 都可以很方便地使用了，甚至对 Grunt、Gulp 这类的工具都有集成一些任务管理器，这对前端来说，是一件鼓舞人心的事。",[28,1205,1206,1207,1210,1211,1213,1214,1216,1217,1219,1220,1223],{},"ASP.NET Core MVC 的推荐目录结构也进行了调整，新增了",[133,1208,1209],{},"wwwroot","这样一个静态目录，js、css、图片都可以放这里面，而 Bower 管理的第三方前端库则会自动下载到",[133,1212,1209],{},"里面的 lib 目录下。作为强迫症的我，",[133,1215,1209],{},"这个目录必须全部是自动生成的。通过 Gulp，可以很轻松的实现这一点。继承原先的目录结构习惯，在解决方案下建立 Scripts、Styles、Images 文件夹，里面用来放原始的 js、less 和图片，然后通过 Gulp 进行合并、压缩、复制到",[133,1218,1209],{},"目录下，这样 wwwroot 这个目录就可以在 git 里面排除掉了。完美。而在 ASP.NET Core 的项目目录下默认的",[133,1221,1222],{},".gitignore","文件里，微软其实是已经有这样的想法：",[127,1225,1227],{"className":897,"code":1226,"language":899,"meta":86,"style":86},"# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot\u002F\n",[133,1228,1229,1234],{"__ignoreMap":86},[136,1230,1231],{"class":138,"line":139},[136,1232,1233],{"class":431},"# Uncomment if you have tasks that create the project's static files in wwwroot\n",[136,1235,1236],{"class":138,"line":87},[136,1237,1238],{"class":431},"#wwwroot\u002F\n",[28,1240,1241],{},"在代码层面，和之前差别不大，基本上 M、V、C 的代码都可以直接拿过来用。在 bundle 上有一些变化，然而我是直接删掉了默认的 bundle 配置，既然可以方便地使用 Gulp 了，为啥不用呢？",[28,1243,1244,1245,1248,1249,1251,1252,1255,1256,1259],{},"在 View 中，新增了",[133,1246,1247],{},"environment","的语法，可以通过",[133,1250,1247],{},"标签来控制开发环境和生产环境的不同输出，主要是用来控制 css、js 这些文件的引用，在开发环境下使用未压缩的文件，在生产环境下使用压缩过的文件。还提供了 cdn 的方式，可以配置多个链接，优先使用 CDN 的链接，通过",[133,1253,1254],{},"asp-fallback-test","来检查 CDN 的链接是否可用，不可用的话再切换为本地的链接。和之前 Bundle 里面的方式差不多，只是使用起来更简单了。现在 css、js 这些文件的缓存控制也比以前更简单，只需要加上",[133,1257,1258],{},"asp-append-version=\"true\"","即可在文件名后面自动加上版本号后缀。",[28,1261,1262],{},"项目部署上面，确实遇到了一个坑。我是通过 Web Deploy 来自动部署的，花了半天时间才终于搞定。",[52,1264,1265,1272,1292,1297],{},[55,1266,1267,1268,1271],{},"IIS 里应用程序池中的",[133,1269,1270],{},".NET CLR","版本要选择“无托管代码”",[55,1273,335,1274,1276,1277,1280,1281,1284,1285,1288,1289,1291],{},[133,1275,340],{},"，这里有个大坑，安装完之后要执行一下",[133,1278,1279],{},"iisreset","，我没有执行这一步，导致出现了",[133,1282,1283],{},"HTTP Error 502.5 - Process Failure","的问题，从事件查看器里面看到的错误日志是：",[133,1286,1287],{},"Failed to start process with commandline '\"dotnet\" .\\****.dll', ErrorCode = '0x80070002'.","。遇到同样问题的朋友可以试试",[133,1290,1279],{},"或者重启机器。",[55,1293,335,1294,38],{},[133,1295,1296],{},"HttpPlatformHandler",[55,1298,1299],{},"还有个就是我当时用 Web Delpoy 往服务器部署的时候，文件总是推不上去，后来 Google 了一下，在 pubxml 里面加上了以下两行：",[127,1301,1302],{"className":788,"code":789,"language":790,"meta":86,"style":86},[133,1303,1304,1320],{"__ignoreMap":86},[136,1305,1306,1308,1310,1312,1314,1316,1318],{"class":138,"line":139},[136,1307,460],{"class":142},[136,1309,800],{"class":799},[136,1311,803],{"class":142},[136,1313,806],{"class":431},[136,1315,809],{"class":142},[136,1317,800],{"class":799},[136,1319,814],{"class":142},[136,1321,1322,1324,1326,1328,1330,1332,1334],{"class":138,"line":87},[136,1323,460],{"class":142},[136,1325,821],{"class":799},[136,1327,803],{"class":142},[136,1329,826],{"class":431},[136,1331,809],{"class":142},[136,1333,821],{"class":799},[136,1335,814],{"class":142},[52,1337,1338],{"start":212},[55,1339,1340,1341,1345,1346,1349],{},"下载",[32,1342,1344],{"href":752,"rel":1343,"title":1344},[36],"Provisioning PowerShell script","，在服务器上使用",[133,1347,1348],{},"PowerShell","运行，输入应用程序池的名称即可。",[284,1351,1352],{},"html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":86,"searchDepth":87,"depth":87,"links":1354},[],"2016-07-21",{},"\u002Fposts\u002F2016\u002Fasp-net-core-first-experience",{"text":1359,"minutes":1360,"time":1361,"words":1362},"4 min read",3.695,221700,739,{"title":1198,"description":1203},{"loc":1357},"posts\u002F2016\u002F20160721.asp-net-core-first-experience",[106,107],"R33Y8oAf52Ae4S4ZF29eR7LlxZpXApb2LypHiBQIWSw",{"id":1369,"title":1370,"body":1371,"class":89,"cover":89,"coverSize":89,"date":1414,"description":1415,"draft":92,"extension":93,"hideComments":92,"location":1416,"meta":1417,"navigation":95,"path":1418,"readingTime":1419,"seo":1423,"sitemap":1424,"stem":1425,"tags":1426,"time":89,"weather":89,"__hash__":1427},"posts\u002Fposts\u002F2015\u002F20150323.authenticationmanager-signout-not-working.md","AuthenticationManager 无法注销用户的问题",{"type":25,"value":1372,"toc":1412},[1373,1380,1394,1397,1400,1406],[28,1374,1375,1376,1379],{},"最近遇到一个很诡异的问题，在最近的一个新项目中，发现在 MVC5 下，偶尔会出现登陆的用户无法注销的问题，经检查发现",[133,1377,1378],{},"AuthenticationManager.SignOut()","执行之后并没有删除 Cookie，手动删除 Cookie 之后，该功能又正常了，又能正常登陆、注销了。前面几次出现这个问题我都是手动删除 Cookie，发现恢复了之后，我也就没在意。",[28,1381,1382,1383,1386,1387,1389,1390,38],{},"刚刚又出现这个问题，我怒了，决定 Google 下。Google 了一番之后，发现这个问题还挺普遍，但是都没有什么好的答案。后来看到有人说，用",[133,1384,1385],{},"AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie)","可以解决这个问题，一试，还真解决了。可是官方的例子里并没有传这个参数，而且我以前的几个站点，都是用的官方例子里的",[133,1388,1378],{},"，而且都没有出现这个问题。百思不得其解，好挫折。不弄清楚睡不着觉。于是又继续搜，终于发现了一个帖子，",[32,1391,1392],{"href":1392,"rel":1393},"https:\u002F\u002Faspnetidentity.codeplex.com\u002Fworkitem\u002F2347",[36],[28,1395,1396],{},"当初这个问题应该是发生在 Microsoft.AspNet.Identity 2.0\u002F2.1 rc + Microsoft.Owin.3.0 rc 版中，我以前项目用的 Identity2.2 + Owin 3.0 中，应该是没有这个问题。最近刚更新的 Identity2.3 + Owin 3.0.1 中，又有了这个问题。",[28,1398,1399],{},"哈哈！突然感觉我已经走在 MVC 的前沿了。记下这个问题，为今后遇到这个问题的朋友们排忧解难！",[28,1401,1402,1403,1405],{},"解决方案就是，在 LogOff 方法里，用",[133,1404,1385],{},"就行了。",[28,1407,1408,1409,38],{},"当然，我这个项目并没有用到第三方登陆，如果用到了第三方登陆，可能还需要添加",[133,1410,1411],{},"AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);",{"title":86,"searchDepth":87,"depth":87,"links":1413},[],"2015-03-23","最近遇到一个很诡异的问题，在最近的一个新项目中，发现在 MVC5 下，偶尔会出现登陆的用户无法注销的问题，经检查发现AuthenticationManager.SignOut()执行之后并没有删除 Cookie，手动删除 Cookie 之后，该功能又正常了，又能正常登陆、注销了。前面几次出现这个问题我都是手动删除 Cookie，发现恢复了之后，我也就没在意。","Home",{},"\u002Fposts\u002F2015\u002Fauthenticationmanager-signout-not-working",{"text":98,"minutes":1420,"time":1421,"words":1422},2.03,121800,406,{"title":1370,"description":1415},{"loc":1418},"posts\u002F2015\u002F20150323.authenticationmanager-signout-not-working",[106,107],"wtzFl_TJcolfsXAqKAiPNQyzXqyzmEkZ4wHoeuvjm4E",{"id":1429,"title":1430,"body":1431,"class":89,"cover":89,"coverSize":89,"date":1452,"description":1453,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":1454,"navigation":95,"path":1455,"readingTime":1456,"seo":1461,"sitemap":1462,"stem":1463,"tags":1464,"time":1465,"weather":89,"__hash__":1466},"posts\u002Fposts\u002F2012\u002F20121219.snaps-to-device-pixels.md","【WPF 学习日记】SnapsToDevicePixels 属性",{"type":25,"value":1432,"toc":1450},[1433,1440,1443],[28,1434,1435,1436,1439],{},"今天在给 ListBoxItem 添加 Border 的时候，发现 ",[133,1437,1438],{},"BorderThickness = 1"," 时，出现了意料之外的问题。",[28,1441,1442],{},"我给每个 ListBoxItem 的 Border 设置为，上、左、右的厚度为 0，下方的厚度为 1，这样的效果是把 ListBoxItem 分隔开来，但是我发现他们之间的分割线，居然不一样厚，有点模糊，不是点阵的线，而是有那种抗锯齿的感觉，很不爽。",[28,1444,1445,1446,1449],{},"后来发现 Border 有 ",[133,1447,1448],{},"SnapsToDevicePixels"," 这么个属性，看名字感觉或许有效果，把它打勾之后，发现果然问题解决了。它的作用是使像素与显示器对齐，我的理解就是点阵效果。",{"title":86,"searchDepth":87,"depth":87,"links":1451},[],"2012-12-19","今天在给 ListBoxItem 添加 Border 的时候，发现 BorderThickness = 1 时，出现了意料之外的问题。",{},"\u002Fposts\u002F2012\u002Fsnaps-to-device-pixels",{"text":1457,"minutes":1458,"time":1459,"words":1460},"1 min read",0.82,49200,164,{"title":1430,"description":1453},{"loc":1455},"posts\u002F2012\u002F20121219.snaps-to-device-pixels",[106,107],"晚上","ARRLsels47DUMIQffXFfMFRUzrkl0Xdp9FmcNHjKtbU",{"id":1468,"title":1469,"body":1470,"class":89,"cover":89,"coverSize":89,"date":1483,"description":1474,"draft":92,"extension":93,"hideComments":92,"location":89,"meta":1484,"navigation":95,"path":1485,"readingTime":1486,"seo":1490,"sitemap":1491,"stem":1492,"tags":1493,"time":89,"weather":89,"__hash__":1494},"posts\u002Fposts\u002F2012\u002F20121217.try-mono-for-android.md","Mono For Android 试用感想",{"type":25,"value":1471,"toc":1481},[1472,1475,1478],[28,1473,1474],{},"昨天发现一个很厉害的工具，Mono，可以使用 C#来写 Android 程序，如果可以用 Visual Studio 来写 Android 程序，那简直太爽了！",[28,1476,1477],{},"很兴奋，花了很长时间把搭建环境需要的东西都下载好了。早上花了一早上把环境搭建好了，测试了一个 Demo，很伤心。",[28,1479,1480],{},"以为它生成的 apk 文件是可以直接在机器上运行的，然而发现它还需要在 Android 上安装它所需要的环境，需要安装十几兆的东西，这个不能忍。也不知道是不是免费版的原因，总之不令我满意。Over。还是乖乖用 Eclipse 和 Java 吧。",{"title":86,"searchDepth":87,"depth":87,"links":1482},[],"2012-12-17",{},"\u002Fposts\u002F2012\u002Ftry-mono-for-android",{"text":1457,"minutes":1487,"time":1488,"words":1489},0.87,52200,174,{"title":1469,"description":1474},{"loc":1485},"posts\u002F2012\u002F20121217.try-mono-for-android",[106,107],"pQPCJKzAXg8qa5MIcom8VvCRwiiaY54XoemmHjQqvxI",{"id":1496,"title":1497,"body":1498,"class":89,"cover":89,"coverSize":89,"date":1660,"description":1502,"draft":92,"extension":93,"hideComments":92,"location":1661,"meta":1662,"navigation":95,"path":1663,"readingTime":1664,"seo":1668,"sitemap":1669,"stem":1670,"tags":1671,"time":1465,"weather":89,"__hash__":1672},"posts\u002Fposts\u002F2012\u002F20121215.type-initialization-exception.md","静态成员初始化异常的解决办法",{"type":25,"value":1499,"toc":1658},[1500,1503,1506,1509,1648,1655],[28,1501,1502],{},"今天遇到了这样一个问题，在调用某个类的静态方法时，产生了这样一个异常“未处理 TypeInitializationException “XXXXX”的类型初始值设定项引发异常。”然而，这个方法我是做了异常处理的，可就是无法捕获到这个异常的位置。后来发现，是由于这个类里的静态成员初始化产生了异常，这个要如何解决呢？",[28,1504,1505],{},"我们可以利用静态构造函数来解决这个问题，静态构造函数和实例构造函数之间的区别在于静态构造函数是由 CLR 调用执行的，所以静态构造函数只能是一个，同时不能有参数。",[28,1507,1508],{},"使用方法如下：",[127,1510,1512],{"className":380,"code":1511,"language":382,"meta":86,"style":86},"public class Command\n{\n    private static SimpleDatabase simpleDatabase;\n    static Command() \u002F\u002F前面不能有修饰符\n    {\n        try\n        {\n            simpleDatabase = new SimpleDatabase(\"settings.db\", \"mima\");\n        }\n        catch\n        {\n            \u002F\u002F处理异常\n        }\n    }\n}\n",[133,1513,1514,1526,1530,1547,1561,1566,1572,1577,1610,1615,1621,1626,1632,1637,1643],{"__ignoreMap":86},[136,1515,1516,1520,1523],{"class":138,"line":139},[136,1517,1519],{"class":1518},"sbsja","public",[136,1521,1522],{"class":389}," class",[136,1524,1525],{"class":393}," Command\n",[136,1527,1528],{"class":138,"line":87},[136,1529,143],{"class":142},[136,1531,1532,1535,1538,1541,1544],{"class":138,"line":165},[136,1533,1534],{"class":1518},"    private",[136,1536,1537],{"class":1518}," static",[136,1539,1540],{"class":393}," SimpleDatabase",[136,1542,1543],{"class":393}," simpleDatabase",[136,1545,1546],{"class":142},";\n",[136,1548,1549,1552,1555,1558],{"class":138,"line":192},[136,1550,1551],{"class":1518},"    static",[136,1553,1554],{"class":415}," Command",[136,1556,1557],{"class":142},"()",[136,1559,1560],{"class":1126}," \u002F\u002F前面不能有修饰符\n",[136,1562,1563],{"class":138,"line":212},[136,1564,1565],{"class":142},"    {\n",[136,1567,1568],{"class":138,"line":218},[136,1569,1571],{"class":1570},"sVHd0","        try\n",[136,1573,1574],{"class":138,"line":669},[136,1575,1576],{"class":142},"        {\n",[136,1578,1579,1582,1584,1586,1588,1590,1592,1595,1597,1600,1602,1605,1607],{"class":138,"line":674},[136,1580,1581],{"class":431},"            simpleDatabase ",[136,1583,955],{"class":397},[136,1585,401],{"class":397},[136,1587,1540],{"class":393},[136,1589,428],{"class":142},[136,1591,156],{"class":179},[136,1593,1594],{"class":183},"settings.db",[136,1596,156],{"class":179},[136,1598,1599],{"class":142},",",[136,1601,180],{"class":179},[136,1603,1604],{"class":183},"mima",[136,1606,156],{"class":179},[136,1608,1609],{"class":142},");\n",[136,1611,1612],{"class":138,"line":1138},[136,1613,1614],{"class":142},"        }\n",[136,1616,1618],{"class":138,"line":1617},10,[136,1619,1620],{"class":1570},"        catch\n",[136,1622,1624],{"class":138,"line":1623},11,[136,1625,1576],{"class":142},[136,1627,1629],{"class":138,"line":1628},12,[136,1630,1631],{"class":1126},"            \u002F\u002F处理异常\n",[136,1633,1635],{"class":138,"line":1634},13,[136,1636,1614],{"class":142},[136,1638,1640],{"class":138,"line":1639},14,[136,1641,1642],{"class":142},"    }\n",[136,1644,1646],{"class":138,"line":1645},15,[136,1647,221],{"class":142},[28,1649,1650,1651,1654],{},"注意， 在 catch 到异常之后，我刚开始还想 ",[133,1652,1653],{},"throw new Exception(\"SimpleDatabase初始化失败\")","，但是这样是不行的，依旧会在外层报出 “TypeInitializationException” 的异常。所以异常只能在静态构造函数内部处理掉，我的解决办法是，既然我不能打开自己建立的数据库，那么这个数据库文件肯定损坏了，或者并不是我原先生成的数据库，那我就重新建立一个数据库文件好了，因为我这个数据库文件里只是存放的一些简单配置，所以无妨。",[284,1656,1657],{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":86,"searchDepth":87,"depth":87,"links":1659},[],"2012-12-15","宿舍",{},"\u002Fposts\u002F2012\u002Ftype-initialization-exception",{"text":293,"minutes":1665,"time":1666,"words":1667},1.86,111600,372,{"title":1497,"description":1502},{"loc":1663},"posts\u002F2012\u002F20121215.type-initialization-exception",[106,107],"TZeRlPit3sTNSuXBopyj3_DIJggbee8Zo6i4UTJq9Cs",{"id":1674,"title":1675,"body":1676,"class":89,"cover":89,"coverSize":89,"date":1692,"description":1680,"draft":92,"extension":93,"hideComments":92,"location":1661,"meta":1693,"navigation":95,"path":1694,"readingTime":1695,"seo":1699,"sitemap":1700,"stem":1701,"tags":1702,"time":1703,"weather":89,"__hash__":1704},"posts\u002Fposts\u002F2012\u002F20121130.could-not-load-file-or-assembly.md","未能加载文件或程序集 “XXXXXXX” 或它的某一个依赖项。试图加载格式不正确的程序的解决方法",{"type":25,"value":1677,"toc":1690},[1678,1681,1684,1687],[28,1679,1680],{},"好久没有写博客了。",[28,1682,1683],{},"这个问题之前遇到过一次，但是当时没有记下来，导致今天遇到这个问题的时候，我已经想不起来是什么原因了，又花了好长时间搜索、查找，才终于解决，所以我决定把它记下来。",[28,1685,1686],{},"无法加载文件或程序集，可能有多种原因，网上多数是因为 DLL 没有复制到 bin 文件夹下，或者程序集名称不一致等等，但这些并不是我的项目里所发生的。",[28,1688,1689],{},"我的问题其实是这样的，我的 A 项目引用了我自己写的一个类库 B，B 里面引用了一个 DLL，但是这个 DLL 的目标平台是 x86，而我的 A 项目的目标平台是 Any CPU，导致无法运行，所以只需要把 A 项目的目标平台修改为 x86，就 OK 了。至于类库 B，还是默认的 Any CPU，好像也没有什么问题。",{"title":86,"searchDepth":87,"depth":87,"links":1691},[],"2012-11-30",{},"\u002Fposts\u002F2012\u002Fcould-not-load-file-or-assembly",{"text":293,"minutes":1696,"time":1697,"words":1698},1.26,75600,252,{"title":1675,"description":1680},{"loc":1694},"posts\u002F2012\u002F20121130.could-not-load-file-or-assembly",[106,107],"下午","MrVf6xwahX4tUMhv9bQXMqqpee1PV-Yc4MSD3_VGyFI",{"id":1706,"title":1707,"body":1708,"class":89,"cover":89,"coverSize":89,"date":1848,"description":1712,"draft":92,"extension":93,"hideComments":92,"location":1661,"meta":1849,"navigation":95,"path":1850,"readingTime":1851,"seo":1855,"sitemap":1856,"stem":1857,"tags":1858,"time":1465,"weather":89,"__hash__":1859},"posts\u002Fposts\u002F2012\u002F20120925.sqlite-error-no-such-table.md","关于 sqlite error no such table 错误的解决办法",{"type":25,"value":1709,"toc":1846},[1710,1713,1717,1720,1723,1734,1765,1768,1837,1840,1843],[28,1711,1712],{},"今天开始尝试为“星际 2 客户端切换器”添加 Win7 下的 JumpList 功能，如图：",[1714,1715],"post-image",{"filename":1716},"01.png",[1714,1718],{"filename":1719},"02.png",[28,1721,1722],{},"这样可以在任务栏和开始菜单中快速启动相应的客户端，而不需要启动软件。",[28,1724,1725,1726,1729,1730,1733],{},"在测试过程中遇到一个错误，",[133,1727,1728],{},"sqlite error no such table…","，百思不得其解，一直以为是由于 JumpList 在未启动程序的情况下调用程序内的方法导致数据库没有加载的问题，但后来始终没有弄明白，一直在搜索关于 JumpList 调用的问题。后来干脆直接搜 ",[133,1731,1732],{},"sqlite error no such table"," 的错误原因，才发现问题所在。我的数据库调用使用的是相对地址：",[127,1735,1737],{"className":380,"code":1736,"language":382,"meta":86,"style":86},"SQLiteConnection conn = new SQLiteConnection(\"Data Source = settings.db;\");\n",[133,1738,1739],{"__ignoreMap":86},[136,1740,1741,1744,1747,1749,1751,1754,1756,1758,1761,1763],{"class":138,"line":139},[136,1742,1743],{"class":393},"SQLiteConnection",[136,1745,1746],{"class":393}," conn",[136,1748,398],{"class":397},[136,1750,401],{"class":397},[136,1752,1753],{"class":393}," SQLiteConnection",[136,1755,428],{"class":142},[136,1757,156],{"class":179},[136,1759,1760],{"class":183},"Data Source = settings.db;",[136,1762,156],{"class":179},[136,1764,1609],{"class":142},[28,1766,1767],{},"在直接打开软件是没有任何问题的，但是通过 JumpList 调用的话，我怀疑启动的位置不一样，所以导致找不到数据库，于是换成：",[127,1769,1771],{"className":380,"code":1770,"language":382,"meta":86,"style":86},"SQLiteConnection conn = new SQLiteConnection(@\"Data Source =\" + System.Windows.Forms.Application.StartupPath + \"\\\\settings.db;\");\n",[133,1772,1773],{"__ignoreMap":86},[136,1774,1775,1777,1779,1781,1783,1785,1787,1790,1793,1795,1798,1801,1803,1806,1808,1811,1813,1816,1818,1821,1824,1826,1830,1833,1835],{"class":138,"line":139},[136,1776,1743],{"class":393},[136,1778,1746],{"class":393},[136,1780,398],{"class":397},[136,1782,401],{"class":397},[136,1784,1753],{"class":393},[136,1786,428],{"class":142},[136,1788,1789],{"class":179},"@\"",[136,1791,1792],{"class":183},"Data Source =",[136,1794,156],{"class":179},[136,1796,1797],{"class":397}," +",[136,1799,1800],{"class":431}," System",[136,1802,435],{"class":142},[136,1804,1805],{"class":431},"Windows",[136,1807,435],{"class":142},[136,1809,1810],{"class":431},"Forms",[136,1812,435],{"class":142},[136,1814,1815],{"class":431},"Application",[136,1817,435],{"class":142},[136,1819,1820],{"class":431},"StartupPath ",[136,1822,1823],{"class":397},"+",[136,1825,180],{"class":179},[136,1827,1829],{"class":1828},"s_hVV","\\\\",[136,1831,1832],{"class":183},"settings.db;",[136,1834,156],{"class":179},[136,1836,1609],{"class":142},[28,1838,1839],{},"问题搞定！",[28,1841,1842],{},"今后数据库文件还是用绝对位置比较妥当。",[284,1844,1845],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":86,"searchDepth":87,"depth":87,"links":1847},[],"2012-09-25",{},"\u002Fposts\u002F2012\u002Fsqlite-error-no-such-table",{"text":293,"minutes":1852,"time":1853,"words":1854},1.315,78900,263,{"title":1707,"description":1712},{"loc":1850},"posts\u002F2012\u002F20120925.sqlite-error-no-such-table",[106,107],"P6y0J80I5fzcC1tuPSFGnPDkKZlIcPcpa1iAtl6m4KM",{"id":1861,"title":1862,"body":1863,"class":89,"cover":89,"coverSize":89,"date":2113,"description":1867,"draft":92,"extension":93,"hideComments":92,"location":2114,"meta":2115,"navigation":95,"path":2116,"readingTime":2117,"seo":2121,"sitemap":2122,"stem":2123,"tags":2124,"time":2125,"weather":89,"__hash__":2126},"posts\u002Fposts\u002F2012\u002F20120728.csharp-get-ipaddress.md","C# 获取指定网卡的 IP 地址",{"type":25,"value":1864,"toc":2111},[1865,1868,1871,1874,2105,2108],[28,1866,1867],{},"最近几天都在玩游戏，没怎么编程，感觉好空虚啊！主要是之前在 Android 上建立 wifi 热点出现了一些问题，难以进展下去，于是便耽搁了，今天决定先跳过那个问题，Android 手机之间的传输先暂时不考虑，先做一下 Android 与 PC 之间的数据传输。",[28,1869,1870],{},"刚刚主要完成了这么一件事情，根据指定的网卡获取其 ip，以便之后的 socket 使用。",[28,1872,1873],{},"会出现这个问题是因为我是利用 Win7 的 netsh 功能建立的虚拟网卡，它与其它网卡可以同时存在，这就意味着这台主机可能拥有多个 ip 地址，然而我们需要的只是我们建立的虚拟网卡的那个 ip 地址，实现方法如下：",[127,1875,1877],{"className":380,"code":1876,"language":382,"meta":86,"style":86},"NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); \u002F\u002F获取本机所有网卡对象\nforeach (NetworkInterface adapter in adapters)\n{\n    if (adapter.Description.Contains(\"Virtual\")) \u002F\u002F枚举条件：描述中包含 \"Virtual\"\n    {\n        IPInterfaceProperties ipProperties = adapter.GetIPProperties(); \u002F\u002F获取 IP 配置\n        UnicastIPAddressInformationCollection ipCollection = ipProperties.UnicastAddresses; \u002F\u002F获取单播地址集\n        foreach (UnicastIPAddressInformation ip in ipCollection)\n        {\n            if (ip.Address.AddressFamily == AddressFamily.InterNetwork) \u002F\u002F只要 ipv4 的\n                ipAddress = ip.Address; \u002F\u002F获取 ip\n        }\n    }\n}\n",[133,1878,1879,1906,1927,1931,1966,1970,1992,2015,2034,2038,2075,2093,2097,2101],{"__ignoreMap":86},[136,1880,1881,1884,1887,1890,1892,1895,1897,1900,1903],{"class":138,"line":139},[136,1882,1883],{"class":393},"NetworkInterface",[136,1885,1886],{"class":142},"[]",[136,1888,1889],{"class":393}," adapters",[136,1891,398],{"class":397},[136,1893,1894],{"class":431}," NetworkInterface",[136,1896,435],{"class":142},[136,1898,1899],{"class":415},"GetAllNetworkInterfaces",[136,1901,1902],{"class":142},"();",[136,1904,1905],{"class":1126}," \u002F\u002F获取本机所有网卡对象\n",[136,1907,1908,1911,1914,1916,1919,1922,1924],{"class":138,"line":87},[136,1909,1910],{"class":1570},"foreach",[136,1912,1913],{"class":142}," (",[136,1915,1883],{"class":393},[136,1917,1918],{"class":393}," adapter",[136,1920,1921],{"class":1570}," in",[136,1923,1889],{"class":431},[136,1925,1926],{"class":142},")\n",[136,1928,1929],{"class":138,"line":165},[136,1930,143],{"class":142},[136,1932,1933,1936,1938,1941,1943,1946,1948,1951,1953,1955,1958,1960,1963],{"class":138,"line":192},[136,1934,1935],{"class":1570},"    if",[136,1937,1913],{"class":142},[136,1939,1940],{"class":431},"adapter",[136,1942,435],{"class":142},[136,1944,1945],{"class":431},"Description",[136,1947,435],{"class":142},[136,1949,1950],{"class":415},"Contains",[136,1952,428],{"class":142},[136,1954,156],{"class":179},[136,1956,1957],{"class":183},"Virtual",[136,1959,156],{"class":179},[136,1961,1962],{"class":142},"))",[136,1964,1965],{"class":1126}," \u002F\u002F枚举条件：描述中包含 \"Virtual\"\n",[136,1967,1968],{"class":138,"line":212},[136,1969,1565],{"class":142},[136,1971,1972,1975,1978,1980,1982,1984,1987,1989],{"class":138,"line":218},[136,1973,1974],{"class":393},"        IPInterfaceProperties",[136,1976,1977],{"class":393}," ipProperties",[136,1979,398],{"class":397},[136,1981,1918],{"class":431},[136,1983,435],{"class":142},[136,1985,1986],{"class":415},"GetIPProperties",[136,1988,1902],{"class":142},[136,1990,1991],{"class":1126}," \u002F\u002F获取 IP 配置\n",[136,1993,1994,1997,2000,2002,2004,2006,2009,2012],{"class":138,"line":669},[136,1995,1996],{"class":393},"        UnicastIPAddressInformationCollection",[136,1998,1999],{"class":393}," ipCollection",[136,2001,398],{"class":397},[136,2003,1977],{"class":431},[136,2005,435],{"class":142},[136,2007,2008],{"class":431},"UnicastAddresses",[136,2010,2011],{"class":142},";",[136,2013,2014],{"class":1126}," \u002F\u002F获取单播地址集\n",[136,2016,2017,2020,2022,2025,2028,2030,2032],{"class":138,"line":674},[136,2018,2019],{"class":1570},"        foreach",[136,2021,1913],{"class":142},[136,2023,2024],{"class":393},"UnicastIPAddressInformation",[136,2026,2027],{"class":393}," ip",[136,2029,1921],{"class":1570},[136,2031,1999],{"class":431},[136,2033,1926],{"class":142},[136,2035,2036],{"class":138,"line":1138},[136,2037,1576],{"class":142},[136,2039,2040,2043,2045,2048,2050,2053,2055,2058,2061,2064,2066,2069,2072],{"class":138,"line":1617},[136,2041,2042],{"class":1570},"            if",[136,2044,1913],{"class":142},[136,2046,2047],{"class":431},"ip",[136,2049,435],{"class":142},[136,2051,2052],{"class":431},"Address",[136,2054,435],{"class":142},[136,2056,2057],{"class":431},"AddressFamily ",[136,2059,2060],{"class":397},"==",[136,2062,2063],{"class":431}," AddressFamily",[136,2065,435],{"class":142},[136,2067,2068],{"class":431},"InterNetwork",[136,2070,2071],{"class":142},")",[136,2073,2074],{"class":1126}," \u002F\u002F只要 ipv4 的\n",[136,2076,2077,2080,2082,2084,2086,2088,2090],{"class":138,"line":1623},[136,2078,2079],{"class":431},"                ipAddress ",[136,2081,955],{"class":397},[136,2083,2027],{"class":431},[136,2085,435],{"class":142},[136,2087,2052],{"class":431},[136,2089,2011],{"class":142},[136,2091,2092],{"class":1126}," \u002F\u002F获取 ip\n",[136,2094,2095],{"class":138,"line":1628},[136,2096,1614],{"class":142},[136,2098,2099],{"class":138,"line":1634},[136,2100,1642],{"class":142},[136,2102,2103],{"class":138,"line":1639},[136,2104,221],{"class":142},[28,2106,2107],{},"任务完成！下面开始学习 socket 通信。",[284,2109,2110],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":86,"searchDepth":87,"depth":87,"links":2112},[],"2012-07-28","成都",{},"\u002Fposts\u002F2012\u002Fcsharp-get-ipaddress",{"text":293,"minutes":2118,"time":2119,"words":2120},1.52,91200,304,{"title":1862,"description":1867},{"loc":2116},"posts\u002F2012\u002F20120728.csharp-get-ipaddress",[106,107],"中午","GwWG8vIatcoF2JywldfLLQRoJzUjhKTelQzSQc6ah-c",1777579134172]