问题一:
在用jquery写东西的时候犯了一个很白痴的错误:
$.getJSON("xxx.sol",{opt:'gettichengbypid',pid:_pid},function(data){ //显示数据 //清除老数据 while($("#tichengView").get(0).childNodes.length>1){ $("#tichengView").get(0).removeChild($("#tichengView").get(0).lastChild); } for(var i=0;i<data.length;i++){ var tr = document.createElement("TR"); tr.setAttribute("align","center"); var td1 = document.createElement("TD"); var td2 = document.createElement("TD"); var td3 = document.createElement("TD"); td1.innerText = data[i].yewuleixing; td2.innerText = data[i].tichengleixing; td3.innerText = data[i].tichengbili; tr.appendChild(td1); tr.appendChild(td2); tr.appendChild(td3); $("#tichengView").get(0).appendChild(tr); } $("#chanpinquanming").text(pname); $('#w').window('open'); });
此代码将请求发给服务器的Handler处理,服务器Handler编写如下:
public void ProcessRequest(HttpContext context) { context.Response.Clear(); context.Response.ContentType = "text/plain"; context.Response.Charset = "UTF-8"; context.Response.ContentEncoding = Encoding.UTF8; string opt = context.Request.Params["opt"]; if (opt != null && opt == "gettichengbypid") { string pid = context.Request.Params["pid"]; object[][] ret = proMan.GetTichengByPid(Convert.ToInt64(pid)); if (ret != null) { StringBuilder pbuilder = new StringBuilder("["); foreach (object row in ret) { object[] cells = row as object[]; pbuilder.Append("{"); pbuilder.Append("/"yewuleixing/":/"" + (cells[0] == null ? string.Empty : cells[0].ToString()) + "/","); pbuilder.Append("/"tichengleixing/":/"" + (cells[1] == null ? string.Empty : cells[1].ToString()) + "/","); pbuilder.Append("/"tichengbili/":/"" + (cells[2] == null ? string.Empty : cells[2].ToString()) + "/""); pbuilder.Append("},"); } pbuilder.Remove(pbuilder.Length - 1, 1); pbuilder.Append("]"); context.Response.Write(pbuilder.ToString()); } } context.Response.Flush(); context.Response.Close(); }
Web.config中Handler的映射配置如下:
<add verb="*" type="SolHandler" path="*.sol"/>
以上程序经测试一上午在本机开发服务器测试一切正常,但是部署到iis上却没有任何结果,
客户端的回调函数始终没有执行,也没有任何异常可以看到。
尝试用jquery ajax错误处理,也没有看到有用的提示,最终采用手写 Ajax,发现错误编码是 404,
恍然大悟,犯了一个很低级的错误,那就是IIS默认情况下对请求xxx.sol不能解析,因此出现404错误。
赶忙在部署后的虚拟目录上设置ISAPI映射条目,将.sol的请求映射到“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,然后测试,OK,问题解决。
问题二:关于如何取得应用程序根目录的问题,
项目代码如下:
<a href='<%=Request.ApplicationPath %>/ProductEdit.aspx?pid=<%# Eval("pid") %>'>编辑</a>
本地测试这个超连接正常,但是部署到IIS后发现现实出来如下:
http:/ProductEdit.aspx/?pid=26
奇怪了,怀疑还是部署的问题,经检查发现,在IIS上并没有将项目安装在虚拟子目录下,而是直接安装在Web站点下,
解决方案如 下:
private string _rootPath; public string RootPath { get { if (_rootPath==null) { string urlAuthority = Request.Url.GetLeftPart(UriPartial.Authority); _rootPath = Request.ApplicationPath == null || Request.ApplicationPath == "/" ? urlAuthority : //直接安装在Web站点 urlAuthority + Request.ApplicationPath;//安装在虚拟子目录下 } return _rootPath; } }
重新部署,问题解决