網站開發中技術問題的筆記
以下經驗基於 MVC 5.2.3
Javascript
BUG思考
-
200 OK真的表示沒有問題嗎?
有時候Status 200作為WebAPI的返回值,並不表示真的OK,例如取得一個文件,沒有取到,但是返回值也會是200。
200只是表示一個WebAPI執行完畢,沒有異常而已,並不表示肯定成功。 -
IIS7.0 上傳文件失敗,返回404。
乍一看是資源無法找到,其實是設定問題,上傳文件的最大長度限制,還需要下面這樣的配置。
maxRequestLength很多文章都提到了,maxAllowedContentLength則很多文章沒有提到。
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<!--maxRequestLength就是文件的最大字符數,最大值不能超過2個G左右,executionTimeout是超時時間-->
<httpRuntime targetFramework="4.5" maxRequestLength="1073741824" executionTimeout="3600" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!--修改服務器允許最大長度-->
<requestLimits maxAllowedContentLength="1073741824"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
- encodeurl 不能轉 ‘&’ 符號
使用Replace 將 ‘&’ 符號轉成 ‘%26’。
ReSharp之后的問題
使用了ReSharp的移除沒有使用(Remove Unused Reference)的引用之后,Package項目配置文件中的一些Item會被刪除掉,在項目發布的時候一些動態鏈接庫不會被發布到BIN目錄下面,導致以下這樣的問題
未能加載文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一個依賴項。系統找不到指定的文件。
所以一般建議在使用ReSharp之前將項目進行CheckIn,如果出現特殊情況則執行Redo即可。
(具體配置文件:packages.config)
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net451" />
<package id="bootstrap" version="3.3.6" targetFramework="net451" />
<package id="CommonMark.NET" version="0.11.0" targetFramework="net451" />
<package id="Elasticsearch.Net" version="2.1.1" targetFramework="net451" />
<package id="jQuery" version="2.2.2" targetFramework="net451" />
<package id="jQuery.Validation" version="1.15.0" targetFramework="net451" />
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net461" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.1" targetFramework="net451" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net461" />
<package id="Microsoft.Net.Compilers" version="2.0.0-beta1" targetFramework="net451" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" />
<package id="Modernizr" version="2.8.3" targetFramework="net451" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net451" />
<package id="NPOI" version="2.1.3.1" targetFramework="net451" />
<package id="Respond" version="1.4.2" targetFramework="net451" />
<package id="ThoughtWorks.QRCode" version="1.1.0" targetFramework="net451" />
<package id="WebGrease" version="1.6.0" targetFramework="net451" />
</packages>
HttpRequestValidationException:
由於安全上的原因,Asp.net中QueryString等不允許出現<> 這樣的字符
如果你確認的確需要跳過安全驗證,里面最簡單的解決方法是使用Unvalidated版本
string strArticalID = context.Request.Unvalidated.Form["ArticalID"];
Debug版本的時候,VS無法察看很多變量的值,例如Ajax調用ASHX
如果出現多個控制器的時候,可能是因為你的BIN目錄沒有刪除干凈,有一個過期的,以前版本的DLL導致的
Asp.net MVC在運行的時候,會將所有Bin下面的DLL進行解析,如果有一個舊的DLL,例如是改名前的DLL殘留在Bin目錄中,則會出現多個同名控制器的問題。(在VS中怎么檢查都不會發現這個問題的!)
如何設定啟動Areas?
參見RouteConfig的編寫,這里可以指定默認的Area,寫法必須嚴格按照例子.
Home_Default這個路由名字不要使用(可能系統會默認注冊這個名字)
(錯誤信息:路由集合中已存在名為“Home_default”的路由。路由名稱必須唯一。)
View的Layout
如果不指定Layout,默認使用 Views/Shared/_Layout(_ViewStart.cshtml)
類似於React的組件,可以使用DisplayFor來顯示組件
組件放在Shared/DisplayTemplate/ 下面
px 不能省略,RenderBody() 需要CSS3規范的Style
加上去的話,類名稱必須區分大小寫,寫錯則不能識別
這是個瀏覽器兼容性的話題。有時候你會發現HTML的Class名稱大小寫寫錯了,樣式也會生效,這是因為你沒有加上 DOCTYPE 這個TAG。如果加上之后,則類名稱不允許忽略大小寫。
Area名稱不要使用實體名稱,或者其它類的名稱,不然需要名字空間前綴
修改Area名稱后注意各處名字空間的統一
每個Area的webConfig里面,可以添加默認名字空間
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
GET方法如果有參數,則如果需要對應可空的情況,可以使用參數默認值
public ActionResult Index(int PageNo = 1)
*如果同時存在 沒有參數和帶參數的,會報錯。可選參數倒沒有問題。。。
Controller里面設置過 ViewBag.XXXX,如果在之前使用過Model.XXXX,則ViewBag.XXXX變為Model.XXXX
$ajax的變體
可以使用 $.post來簡化Post操作
ASHX里面如何使用Session
添加 IRequiresSessionState 接口即可
public class PublishPost : IHttpHandler, IRequiresSessionState
如何用 Href 實現Post
注意 forms的下標
注意 POST方法必須寫明
<div class="SingleBox">
<a href="/Admin/Accept?ArticalID=@Model.ArticalInfo.Sn" class="btn btn-sm btn-success" onclick="return OpenModal(this.href, '確認接受', '確認接受該條記錄?')">
<span class="glyphicon glyphicon-remove"> 接受 </span>
</a>
<br /><br />
<form action="/Admin/Reject" method="post">
<a href="javascript:document.forms[2].submit();" class="btn btn-sm btn-danger" onclick="return OpenModal(this.href, '確認拒絕', '確認拒絕該條記錄?')">
<span class="glyphicon glyphicon-remove"> 拒絕 </span>
</a>
審核留言:
<input type="text" name="message" style="width:400px" />
<input type="hidden" name="ArticalID" value="@Model.ArticalInfo.Sn" />
</form>
</div>
Javascript操作DOM的Style,屬性是直接使用的,不是“xxx:xxx”
document.getElementById("ReplySubmit_" + PreViewReplyId).style.display = "none";
Bootstrap的btn-primary 可能有Submit的功能!!!
Bootstrap的btn-primary 可能有Submit的功能(待驗證)
使用過的FileStream可能被清空,注意位置和長度
許多對於Stream的操作都會導致流的位置到EOS,或者整個流的被使用完了(無法復用?)
MvcHtmlString 命令頁面生成器不要再次轉換字符串了,不然的話,空格等特殊字符將被模板系統自動轉換
Jquery Wrap,可以給元素增加父元素。。。。。強大啊。。。
$(document).ready(function () {
$(".PostBody img").wrap(
function () {
var filepath = this.src;
var imagefilename = filepath.substring(_urlstr.length + "/FileSystem/Thumbnail?filename=".length)
@{
string Image = ConfigurationManager.AppSettings["Image"];
string jsCode = string.Empty;
if (Image == "QiNiu")
{
jsCode = "filepath = '" + @ConfigurationManager.AppSettings["URLBASE"] + "' + imagefilename;";
}else
{
jsCode = "filepath = '/FileSystem/Image?filename=' + imagefilename;";
}
}
@MvcHtmlString.Create(jsCode)
//原圖是外部連接的處理
if (this.src.indexOf("/FileSystem/Thumbnail") == -1){
if (this.src.indexOf("@ConfigurationManager.AppSettings["URLBASE"]") == -1){
filepath = this.src;
}
}
return "<div class='imgArea'><a href='" + filepath + "'></a></div>"
}
);
C# && Mongo
可以使用轉換規則將DateTime變成Local,不用特性
使用特性:
/// <summary>
/// 創建時間
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime CreateDateTime;
使用轉換規則
BsonSerializer.RegisterSerializer(typeof(DateTime), new DateTimeSerializer(DateTimeKind.Local));
可以使用IgnoreIfNullConvention,則空數據不序列化,
也可以IgnoreExtraElementsConvention忽略數據中有,但是數據模型中沒有的字段。例如數據模型改名之后,數據庫里面的殘留字段。
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
屬性和靜態變量的區別
屬性,公共變量 序列化
靜態變量,const 不序列化
可以嘗試類的嵌套,可以正常序列化
快速JSON
using Newtonsoft.Json;
var result = new
{
success = 1,
message = "提示的信息,上傳成功或上傳失敗及錯誤信息等。",
url = filename
};
string json = JsonConvert.SerializeObject(result);
context.Response.Write(json);
HttpPostedFileWrapper
new HttpPostedFileWrapper(file) as HttpPostedFileBase
使用動態對象快速反序列
dynamic obj = JsonConvert.DeserializeObject(sr.ReadToEnd());
圖片放大方案
<script type="text/javascript" src="http://tsi.github.io/jQuery.imgBox/imgBox/jquery.imgbox.js"></script>
<link rel="stylesheet" href="http://tsi.github.io/jQuery.imgBox/imgBox/imgbox.css" />
<script>
$(document).ready(function () {
$(".PostBody img").wrap(
function(){
return "<div class='imgArea'><a href='" + this.src + "'></a></div>"
}
);
$(".PostBody .imgArea a").imgbox({
slideshow: false
});
});
</script>
MongoDB Query.EQ可以用來查找列表中是否有數據
IMongoQuery tagNameQuery = Query.EQ(nameof(TagName),tag);
Distinct對於數組的處理,是拆開數組項目,進行Distinct!!!!
使用In表示兩個數組是否存在交集(因為In的相等,對於數組是拆開判斷的)
Great Linq
Linq可以做很多強大的工作
x.GroupBy((article) => article.OwnerId).Select(group => new { ownerId = group.Key, Count = group.Count() });
Web(ASHX)服務改名:
修改名字的時候,需要同時修改View MarkUp的代碼
ActionResult 可以通過來設置緩存時間
/// <summary>
/// 縮略圖(JPEG)
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
[OutputCache(Duration = int.MaxValue)]
public ActionResult Thumbnail(string filename)
{
var stream = new MemoryStream();
string Thumbnail = ConfigurationManager.AppSettings["Thumbnail"];
switch (Thumbnail)
{
case "Mongo":
MongoStorage.GetFile(stream, filename, "Thumbnail");
break;
case "FileSystem":
stream = FileSystemStorage.GetFile(filename, "Thumbnail");
break;
case "QiNue":
//實際上這里直接使用QiNue的URL就可以了
stream = QiniuStorage.GetFile(filename);
break;
}
return File(stream.ToArray(), "image/jpeg");
}
BSonDocument 轉 ClassObject
BsonSerializer.Deserialize<Article>(doc)
MongoDB暫時無法中文檢索在Win平台,中文需要企業版的MongoDB
原因是系統不知道如何進行分詞,可以使用第三方的分詞組件
MarkDown Editor(Pandao)研究
http://pandao.github.io/editor.md/
Editor 的可配置項目
打開源代碼可以看到所有的可配置項目
需要添加
<script src="~/Content/editormd/editormd.min.js"></script>
<link rel="stylesheet" href="~/Content/editormd/css/editormd.css" />
font文件夾也必須,不然部分圖標缺失
Convert MD To HTML
Install-Package CommonMark.NET
plugins
圖片上傳等功能需要使用這個Plugins文件夾里面的插件
autofocus:false
防止自動獲得焦點,頁面開始時候垂直位置不正確
對於錯誤的MD語法,該編輯器HTML預覽的時候不會報錯!!!
瀏覽器兼容性問題
Chromn 12px 字體變為 16px
由於縮放問題造成的,CSS里面12px,如果縮放之后,系統還是維持原來的字體大小,整個字體在渲染的時候進行放大處理