【2013年】开发常见问题回顾(一)
记录开发中遇到的和别人问的较多的问题....
目录
IE10中LinkButton不可用
这应该是2013年初遇到的一个BUG,当使用Asp.Net开发Web Application时,页面使用LinkButton按钮;运行页面用IE10打开,点击LinkButton按钮出现如下图错误
没有直接弹出如下图错误,可以运行IE10开发人员工具(F12),在控制台中查看,也会输出 “__doPostBack”未定义 错误信息
解决方法及参考:
下载并在服务器上安装相应补丁程序即可,下载地址:
.NET Framework 2.0 : http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2600100&kbln=zh-cn
.NET Framework 4.0 : http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2600088&kbln=zh-cn
参考来自:
如何配置IIS才能通过链接下载文件
如果不进行任何的配置,通过url直接下载一个doc类型文件(例如:http://www.xxx.com/1.doc),页面会返回如下错误:
HTTP 错误 404.3 - Not Found
由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
解决方法:
以IIS7.5为例
1.在IIS中找到相应的网站
2.在“功能视图”中找到“MIME”类型,双击进入
3.添加,在“文件扩展名”内填入相应的扩展名,比如:.doc
4.在“MIME类型(M)”内填入相应的MIME类型,比如doc文件的MIME:application/msword
5.提交
操作完成后再次点击url,浏览器会填出下载窗口!
不清楚相应类型文件对应的MIME类型可以在此网址查找:
测试发现应该不用每种文件类型指定确切的MIME类型,application/octet-stream 适用于多数文件类型...
如何配置IIS通过链接是下载而不是直接打开txt/图片类型文件
当正确配置MIME类型后,下载文件大部分都可以成功,但是如txt或者是一些图片格式的文件,浏览器不会填出下载窗口,而是会在当前页打开并显示其内容,如果需要直接下载这些类型的文件,还需要其它的IIS配置:
测试只适用于IE!
解决方法:
以IIS7.5为例
1.在IIS中找到相应的网站
2.在“功能视图”中找到“HTTP 响应头”类型,双击进入
3.添加,“名称”内填入:Content-Disposition
4.在“值”内填入:attachment
5.提交
操作完成后,打开IE再次点击url,浏览器会填出下载窗口!
C# 给虚拟目录批量添加MIME示例
using System.DirectoryServices; //添加导出COM组件:Active DS IIS Namespace Provider static void Main(string[] args) { Console.WriteLine("正在添加已有的MIME类型..."); DirectoryEntry virDir_IKeyMgmt = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT/虚拟目录名"); try { PropertyValueCollection mimeCollection = (PropertyValueCollection)virDir_IKeyMgmt.Properties["MimeMap"]; //获取MIME类型 string[] extArr = new string[] {".tar", ".zip", ".gz", ".gds", ".v", ".sof", ".bit", ".stp", ".edf", ".sdc", ".ucf", ".fsdb", ".vcd", ".sess", ".rc", ".result", ".jpg", ".png", ".pdf", ".doc", ".txt", ".log", ".xrc", ".lvs", ".xls", ".elf", ".tr0"}; IISOle.MimeMapClass mimeType = null; foreach (string ext in extArr) { mimeType = new IISOle.MimeMapClass(); mimeType.Extension = ext; mimeType.MimeType = "application/octet-stream"; mimeCollection.Add(mimeType); } virDir_IKeyMgmt.CommitChanges();//更改目录 Console.WriteLine("添加成功!"); } catch (Exception ex) { Console.WriteLine("添加失败!"); Console.WriteLine("错误信息:" + ex.ToString()); } finally { Console.ReadLine(); } }
C# 获取虚拟目录的物理路径示例
/// <summary> /// 获取虚拟目录的物理路径 /// </summary> /// <param name="identifier">虚拟目录所属网站的标识符</param> /// <param name="name">虚拟目录名称</param> /// <returns></returns> private string GetWebVirtualDirectoryPath(string identifier, string name) { DirectoryEntry de = new DirectoryEntry("IIS://LOCALHOST/W3SVC/" + identifier + "/ROOT/" + name); string path = (string)de.Properties["Path"].Value; return path; } /// <summary>???????? /// 获取网站的标识符 /// </summary> /// <param name="portNumber">端口号</param> ///<returns></returns> private string GetWebSiteIdentifier(string portNumber) { DirectoryEntry root = new DirectoryEntry("IIS://LOCALHOST/W3SVC"); foreach (DirectoryEntry e in root.Children) { if (e.SchemaClassName == "IIsWebServer") { foreach (object property in e.Properties["ServerBindings"]) { if (property.Equals(":" + portNumber + ":")) { return e.Name; } } } } //?默认为“默认网站”的标识符 return "1"; }
The name 'ScriptManager' does not exist in the current context
错误如下图:
解决方式:
1.从.aspx页移除ScriptManager控件
2.页面的.cs文件添加using System.Web.UI;
3.再把ScriptManager控件添加到.aspx页
4.重新生成
System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 Office 2010
可能出现此问题的情况有很多
1.连接字符串没有配置正确,可对照相应的版本 http://www.connectionstrings.com/excel/
2.需要安装Microsoft Access 2010 数据库引擎可再发行程序包 http://www.microsoft.com/en-us/download/confirmation.aspx?id=23734
3.如果以上两种情况都解决不了,可以试着修改项目的项目PlatForm为x86
Unable to find manifest signing certificate in the certificate store"
解决方法:
以VS2008为例
1.VS Solution Explorer中选择项目
2.右键,点击进入“properties”,选中“Signing”标签页
3.找到“Sign the ClickOnce manifests”选择,去掉勾选并保存。
配置Session为StateServer的方式
配置方法:
1.修改注册表项
找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters
把AllowRemoteConnection设为1
2.启动ASP.NET State Service服务
把ASP.NET State Service服务设为自动,并且启动它
如果对Session状态的配置方法有疑问可以看看MSDN :
http://msdn.microsoft.com/zh-cn/library/h6bb9cz9(v=VS.85).aspx
如果对Session有哪几种保存方式、分别有什么优劣这些都不是很了解,自已去看看MSDN 看看这篇文章,相信会对Session有更进一步的理解:
http://blog.csdn.net/cityhunter172/article/details/727743
C# 用WMI获取网卡MAC地址示例代码
using System.Management; //添加System。Manageement引用 static void Main(string[] args) { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { WriteLog(mo["MacAddress"].ToString()); } } Console.ReadLine(); }
使用Net User命名创建帐户,如何让密码永不过期的问题
程序通过调用net user命令创建用户,但是此命令未提供设置密码永不过期的参数,如果想设置密码永不过期,可以通过调用第三方Netuser.exe来完成。
下载地址: https://files.cnblogs.com/zhongweiv/NetUser.zip
将 netuser.exe 拷贝到 %systemroot%\system32 下。
Examples:
<Setting >:
/name: set a new name
/pwnexp:{y|n} set 'password never expires'
1. 更改用户名
netuser Administrator /name:"Admin go"
更改Administrator名字为 Admin go
netuser "John Doe" /name:DoeJ
更改John Doe名字为DoeJ
2.是用户用不过期
netuser admin /pwnexp:y
使admin 用户永不过期
net user这些操作可以通过 Network Management Functions 的User相关的方法去实现!
C# 得到文件头信息示例代码
static void Main(string[] args) { string filePath = @"文件绝对路径"; System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader r = new System.IO.BinaryReader(fs); string bx = ""; byte buffer; try { buffer = r.ReadByte(); bx = buffer.ToString(); buffer = r.ReadByte(); bx += buffer.ToString(); } catch (Exception exc) { Console.WriteLine(exc.Message); } r.Close(); fs.Close(); Console.WriteLine(bx); Console.ReadLine(); }
文件头并不是确定文件类型的准确标准,但确实能判断出一些文件,本示例其实也不能叫得到文件头的信息,只是读取了文件的前两个字节,如果作为判断文件的严谨依据,还是要根据具体文件去进去格式分析!
在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序
以IIS6为例
解决方式:
1.在IIS中网站对应的虚拟目录上右键,选属性
2.应用程序名后点创建
C# 利用SharpZipLib对字符串进行压缩
下载地址
https://github.com/icsharpcode/SharpZipLib
#region## 压缩字符串 /// <summary> /// 功能:压缩字符串 /// 创建人:Wilson /// 创建时间:2012-12-27 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string Compress(string str) { byte[] temp = System.Text.Encoding.Unicode.GetBytes(str); System.IO.MemoryStream memStream = new System.IO.MemoryStream(); System.IO.Stream stream = new ICSharpCode.SharpZipLib.BZip2.BZip2OutputStream(memStream); stream.Write(temp, 0, temp.Length); stream.Close(); byte[] compressedData = (byte[])memStream.ToArray(); return System.Convert.ToBase64String(compressedData, 0, compressedData.Length); } #endregion #region## 解压缩字符串 /// <summary> /// 功能:解压缩字符串 /// 创建人:Wilson /// 创建时间:2012-12-27 /// </summary> /// <param name="compressedStr"></param> /// <returns></returns> public static string UnCompress(string compressedStr) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); int totalLen = 0; byte[] temp = System.Convert.FromBase64String(compressedStr); ; byte[] writeTemp = new byte[4096]; System.IO.Stream stream = new ICSharpCode.SharpZipLib.BZip2.BZip2InputStream(new System.IO.MemoryStream(temp)); while (true) { int size = stream.Read(writeTemp, 0, writeTemp.Length); if (size > 0) { totalLen += size; sb.Append(System.Text.Encoding.Unicode.GetString(writeTemp, 0, size)); } else { break; } } stream.Close(); return sb.ToString(); } #endregion
Assembly.Load (Byte[])方法 调用内存占用一直增大的问题
问题表现:动态调用WebSerivce时,因为反复调用使用了Assembly.Load (Byte[]),导致进程内存不断升高
解决方法:
//方法外声明 private static byte[] filedata = null; private static Assembly asm = null; //方法中使用 if (filedata == null) { filedata = File.ReadAllBytes(DLL_NAME); } if (asm == null) { asm = Assembly.Load(filedata); }
IIS7/7.5配置上传大文件
在IIS7/7.5中要上传在文件,不仅需要配置
<httpRuntime executionTimeout="3600" maxRequestLength="2097151"/>
还需要配置如下requestLimits节点
<system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="2147483647"/> </requestFiltering> </security> </system.webServer>
PS:
executionTimeout单位:秒
maxRequestLength单位:KB
maxAllowedContentLength:bytes
maxRequestLength 表示Asp.Net允许上传的大小 默认值:4096KB 最大值:2097151KB(2G-1K)
executionTimeout 表示允许执行的最大时间 默认值是90秒 (超时只有在compilation 节点设置为时才会生效)
httpRuntime 元素(ASP.NET 设置架构)
http://msdn.microsoft.com/zh-cn/library/e1f13641(v=vs.90).aspx
system.webServer节点是IIS7引入的
不要轻易修改上传限制,以防上传大文件攻击服务器!
项目发布在IIS中图片或CSS样式无法正常显示
很多时候在开发环境中页面能正常显示,但发布在IIS中后,显示正常
最常见原因:
1.路径不对正常
特别是发布为虚拟目录时,一定要注意路径问题
2.IIS安装没有勾选“静态内容“选项
多数这种原因比较多,打开IIS配置窗口
Internet Information Services(Internet 信息服务)-->World Wild Web(万维网服务)-->Common HTTP features(常见HTTP功能)-->选中staticcontent(静态内容)
重新刷新页面即可
Web.config文件中配置修改查询超时时间
进行大数据查询或者统计数据时,常出现查询超时,通过配置Web.config连接字符串可以解决(MySQL)
Server=211.136.8.81;Port=3306;Database=lf;Uid=root;Pwd=admin123;CharSet=utf8;Pooling=True;default command timeout=3600;Connection Timeout=3600;
default command timeout和Connection Timeout从字面上就很好理解,就不解释了
友情提示:3600这个值只是示例,具体还是要配置一个相对合理的时间,资源宝贵!
作 者:
Porschev[钟慰]
出 处:
http://www.cnblogs.com/zhongweiv/
微 博:
http://weibo.com/porschev
欢迎任何形式的转载,但请务必注明原文详细链接