坐峰怀雪灬

路漫漫其修远兮,吾将上下而求索。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET异常问题总结

Posted on 2016-07-02 21:19  坐峰怀雪灬  阅读(2059)  评论(0编辑  收藏  举报
输入字符串的格式不正确。
有格式化字符替换符号{0}等,“{”和“}”作为特殊符号出现,如果有多余的“{”和“}”就会出错
GZIP压缩出现FF-F0-F1…是无效的输入流
要解压的字节流无效,可能是非GZIP压缩流
webbrowser 指定的转换无效
跨线程调用 webbrowser只能由自身所在线程直接操作 跨线程操作需要用主线程异步调用委托方式来执行操作
RTF转HTML有未能转换的指令
RTF指令是唯一的,检查替换的是否全面
双字节字符检查是否直接使用了替换导致相似的不应被替换的字符串指令被非法替换而导致乱码
注册表操作时,子项路径前面不能是,否则会出现路径不对的异常,加上为绝对路径
多线程操作务同一资源必加上Lock
Resource 重复定义多次?
一般是由于复制代码后没有改类名,导致出现2个相同名称的类,改一下类名及构造函数名即可解决
未找到XX类上的构造函数
可能是修改了默认无参构造函数,重新添加一个无参构造函数即可
xmlDom从字符串中读取时不能带xml格式声明
xpath属性参数要带引号才能通过 如root/child[@name=’王晓明’],并且xml严格区分大小写,
完整路径写法”/Name1/Name2/..” 
相对路径写法 当前节点.”Name1/Name2″
本来以为自己以前用.NET搞过几次抓取网页的操作,比较了解webrequest,可今天丢出了一个“无法发送具有此谓词类型”异常,弄了半天搞不定,只好GOOGLE了再查 SDK文档。搞定后写写总结。
    如果要向指定的页面提交参数,webrequest提供了一个流,朝里面写就可以了
public virtual Stream GetRequestStream() 
这里有两个地方注意下。第一,如果是以GET方式提交的话,参数直接写到WebRequest构造函数的URL里,如果是以POST方式提交,那就获取这个流,把参数写进流里,注意在写之前必须指定Method 为POST。第二,写入之后要关闭这个流。 
HttpWebRequest 的这三个属性均应该在请求流写入之前。
request.Method = “POST”;
request.ContentType = “application/x-www-form-urlencoded”;
request.ContentLength = postBuffer.Length;
using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(postBuffer, 0, postBuffer.Length);
    requestStream.Close();
}
?如果 Method 在 requestStream.Write 之后设置,则会出现“无法发送具有此谓词类型的内容正文”的错误;
?如果 ContentType 在 requestStream.Write 之后设置,则无法正确提交数据;
?如果 ContentLength 在 requestStream.Write 之后设置,则会出现“写入开始后不能设置此属性”的错误。
checklistbox设置选中项用SetItemChecked ,获取选中用GetItemChecked
回 发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
1.页面上是否有用上数据绑定控件,如果用的话,请放在 if(!IsPostBack){}
2.EnableEventValidation 属性设置为false
3.Form嵌套导致
4.我自己的问题是在添加空间之前清空了其他控件,导致出错
最终总结:某个控件的数据没有获取到或丢失导致验证失败
cs程序发布时报错:错误    1.因为某项目未能生成,所以无法发布。 
                            2.签名是出错:该项不适于在指定状态下使用。 
解决方法: 
签名文件问题,重新选择一下签名文件(就是原来的那个)就可以了。 
xx的类型初始值设定项引发异常
静态成员或构造函数中的值设置有问题
项目太多,引用的时候可能会发生“循环依赖项”的提示!
检查重复引用,实在解决不了就把项目单独打开后引用相关程序集
使用ClickOnce实现手动更新需要用System.Deployment.App…来实现
控件窗体坐标转换, 控件窗体坐标Location是相对于父控件的坐标,但有时需要转为顶级窗体可用的坐标,如果直接使用 Control.Parent.PointToClient()方法获取坐标会导致坐标异常,解决方法是使用 Control.Parent.PointToScreen()转为屏幕坐标,屏幕坐标是固定的,可以作为一个中间值,再使用 Control.FindForm().PointToClient()转为窗体可用的有效坐标,3个小时的成果!!!
控制台标题长度 string.Length<=24500
异常信息
Properties.Settings.Default.R_ShowSOYOUTryAlert    “System.Windows.Forms.PropertyStore”不包含“Settings”的定义,并且找不到可接受类型为 “System.Windows.Forms.PropertyStore”的第一个参数的扩展方法“Settings”(是否缺少 using 指令或程序集引用?)
出错代码:Properties.Settings.Default.R_ShowSOYOUTryAlert
根 据异常信息可以发现系统认为Properties.Settings.Default.R_ShowSOYOUTryAlert 是位于System.Windows.Forms.PropertyStore下的,可实际并不是这样 Properties.Settings.Default.R_ShowSOYOUTryAlert是位于CrmClient.Properties下 的,所以只要将命名空间补全就可以了,可能是窗体有自己独立的配置文件,但名称却都一样,导致系统调用错误
多线程无法访问已释放的资源
这个问题困扰了好久,一直以为使用Control.IsDisposed和Control.Disposing就可以判断控件资源是否已释放或正在释放,但调试过程中才发现,这2个属性根本达不到我所要的结果,我的解决方案如下:
定义一个线程List,线程执行完毕后就自动从List中删掉,添加一个线程是否可以调用控件线程的标志位,当准备释放控件资源时设置控件标志位,拒绝所有线程调用控件,这样就可以避免因为控件释放后线程调用控件资源时出现异常了

Attribute.GetCustomAttribute都可以取到成员Attribute

WebBrowser获取不到焦点
用WebBrowser做一个聊天用的文本编辑器,一切做好后发现每次发完信息焦点都会被从输入框中移除,无论怎么设置都不管用,调试后发现,原来在发送完消息后,执行了一次窗体的Show()方法, 导致焦点丢失
WebBrowser不显示添加的内容
用WebBrowser做一个聊天内容显示控件,但第一条内容往往不显示,后来才发现需要在WebBrowser.DocumentCompleted之后才能安全的修改其内容,如果不等其加载完成后就修改其内容就会出现这种错误
组合框中的项太多,comboBox中如果有成员对象的DisplayMember的值为null就会出现该错误提示,奇怪的异常提示!!!
使用Bitmap保存图片的参数设置System.Drawing.Imaging.Encoder.Quality值为100时会报参数错误,需要改成100L或(long)100,才可以,明明有int类型的重载,为何要用long才会生效?
DateTime.Now.ToString(“yyyy/MM/dd”)这个方法只能输出 yyyy-MM-dd ,经测试需要使用转义符“”,并且是两次转义才可以,比如:DateTime.Now.ToString(“yyyy/MM/dd”)
经测试此问题已不存在
webconfig在外部环境中修改后,一定要检查一下其编码,有的工具如FlashFXP带有文本编辑功能,但其编码是默认的ANSI编码,webconfig用的是UTF8编码,如果编码不一致并且webconfig中有中文则会出错
构造函数中尽量不要使用多线程,最好在构造函数结束之后再调用
webservice中的使用了webmethod特性的方法不能重载,要重载需要设置MessageName
asp.net中注册客户端脚本无效,查看源文件也看不到注册的脚本块,说明脚本注册失败,后来发现原来Form不是服务器端的,缺少runat=”server”
asp.net中同一个ListView的实例如果被添加在多个列表控件中,则修改这个实例会影响所有的列表控件
asp.net中添加自定义IHTTPMODEL后页面输出出现乱码的解决方法
1.页面中添加meta content-control:text/html;charset=utf-8 
2.使用Response.Charset=”utf-8″,但要去掉页面中的Response.Flush(),否则HHTP头里面没有Content-Control:text/html;charset=utf-8
发现不明确的匹配
检查服务器控件id与其他变量名是否有重名,包括大小写不一致但名称相同,比如 Title 和 title 就属于重名
ClickOnce部署时失败:参照的汇编没有安装在系统上
清空x:Documents and SettingsxxxxxxLocal SettingsApps
在调用“Fill”前,SelectCommand 属性尚未初始化。
adapter中没有相应的command或command中的text或connection无效
=======================================================================
回发或回调参数无效。 在配置中使用 或在页面中使用 <%@ Page EnableEventValidation=”true” %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
这两天在开发的时候遇到一个这样的问题,
回 发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/> 或在页面中使用 <%@ Page EnableEventValidation=”true” %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。 
在网上找了两天资料都没有结果
在 剑气潇潇 的文章中看到原因是:
下边引用自:剑气潇潇 的文章http://www.cnblogs.com/asp600/archive/2006/11/04/550216.aspx
目前为止遇到的出现情况有两种:
一是Form嵌套,一个页面只能有一个Form,仔细检查代码就可以解决。
二是在下拉菜单中使用ajax,常见于省市联动菜单,可能是由于在aspx页面赋给了下拉菜单初始Item值,在事件回发时提示该错误,将下拉菜单初始Item值删除,在绑定事件中添加Item项。
后来我自己发现,问题还不是出在那儿.
原因是 DropDownList 控件的ListItem 的Value 属性 包含汉字.只要将Value 改为英文或数字的就行了.
网上还有一种解决办法:把 EnableEventValidation 属性设置为false;但是这样只是没有警告框而已.数据仍然无法传递给服务器,导致SelectedIndex 值一直为零.
最好在web.config中添加如下语句:
<globalization requestEncoding=”utf-8″ responseEncoding=”utf-8″ culture=”zh-CN” uiCulture=”zh-CN”/>
结果搞定,现在贴到这里希望对大家能够有所帮助.
看来ajax.net对中文支持有限啊,还是因为要在Web.Config设置一下编码??????
ref:http://www.cnblogs.com/dongyongjing/archive/2007/03/07/666427.html
=======================================================================
反射修改私有成员的困惑:
一直以为自己对反射比较了解,以为实例对象的成员直接用 实例.GetType()就能获取到全部的反射信息,经过对私有成员的反射测试发现,这样根本取不到私有成员,除非对类进行反射才可以取到全部的反射信息
控制台使用多个线程处理时务必在最后加上Console.ReadLine()来阻塞主线程,否则主线程执行完毕后控制台会退出,其他线程如果是托管线程也会推出,而非托管线程可能会因此失控。
xml属性值必须用单引号或双引号包裹,否则会报错
使用单体模式的时候一定要注意,这个对象是唯一的,任何对于他的事件的绑定是不断添加到这个对象上的,如果不断的添加或导致系统重复调用事件处理方法
webservice报未能识别的http头http://xxx.com/sss,原因是webservice更改了soap中的命名空间,而引用该webservice的应用程序没有更新该引用,还是使用原来的服务
如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未
要使用的SQL连接是一个事务连接,但COMMAND上却没有使用该事务,初始化command的事务属性
System.Diagnostics.Debug或 System.Diagnostics.Trace的TradeListenerCollection使用的是同一个集合,如果一个Listener分别 被添加到Debug和Trace中将会被调用两次:系统自带的TraceListener有三 个:DefaultTraceListener,TextWriterTraceListener,EventLogTraceListener
ASP.NET 禁用GRIDVIEW的视图状态会导致其中的服务器控件事件不触发
ASP.NET 服务器控件使用<%=xxx%>的方式绑定值无效,在GridView或Repeater中向服务器控件绑定值可以用<%# Bind(“Title”) %>的方式,但属性值要用单引号,否则会出现解析错误
无法创建“ORG.GEDU.CMS.Model.TemplateModuleArticle”类型的常量值。此上下文仅支持基元类型或枚举类型。
List<Article> tmas = articleService.FindAll(“ArticleCategory”).Where(a => tms.Select(t => t.ArticleId).Contains(a.Id)).ToList();
红色部分放外面或改为一个数组
MVC中与Html.List()类似的不带For的方法使用时名字必须可以在ViewData中能够查找得到,否则无法正常使用
HttpRequest.AppendHeader 添加HTTP头
使用VS无法生成Release版本,只能生成Debug版本:
可能是引用了Debug目录下的程序集,将程序集拿出来并重新引用即可
错误消息: 未能将许可证文件“Licenses.licx”转换为二进制资源
微软给出的(Microsoft Visual Studio .NET 2002 专业版)解决方案:从该项目中删除 Licenses.licx 文件并重新编译。
但是直接删除再编译会提示找不到这个文件,因为这个文件存在于项目文件中 (xx.csproj)中,找到包含licenses.licx的配置节删掉就可以编译了,如果是web网站没有项目文件,可以在证书上点右键,选择“生 成运行时许可证”,此时会在Bin目录下生成App_Licenses.dll,如果你用的某个组件没有购买授权,可能会有一些授权购买提醒,此时删掉这 个dll就可以解决这个问题,但是下次发布还会重新生成这个文件,网上还有一种解决方案:将licenses.licx 属性的 生成操作 由 嵌入的资源 改成 无,但这种解决方案不适合适合web网站这种不包含项目文件的项目。
不 应为数据协定名称为“ArrayOfint:http://schemas.microsoft.com/2003/10/Serialization /Arrays”的类型“System.Int32[]”。请考虑使用 DataContractResolver,或将任何未知类型以静态方式添加到已知类型的列表。例如,可以使用 KnownTypeAttribute 特性,或者将未知类型添加到传递给 DataContractSerializer 的已知类型列表。
这个问题原因很多:
1.自定义类型没有序列化和反序列化方法,需要自己实现ISerializable
2.使用了泛型基类,泛型参数为集合或数组类型,并且泛型基类实现了序列化,此时需要在子类上加上类型参数的已知属性
如果泛型的类型参数是实现了自定义的序列化方式,则需要将其添加为已知类型
“(DateTime.Now – StartTime).ToString(“HH:mm:ss”)”引发了“System.FormatException”类型的异常 string {System.FormatException}
所以上面的格式字符串应改为“hh’:’mm’:’ss”或@”hh:mm:ss”,格式字符串不能识别“HH”,所以需改为小写“hh”
.Net使用Sqlite提示无法加载System.Data.Sqlite.dll程序集
检查系统版本32位还是64位,System.Data.Sqlite.dll是区分系统的,如果下载的是32位的,需要在生成时将VS中的目标平台改成32位的。