开发者社区> jiankunking> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Winform 调用WCF客户端,所有服务端方法在运行的时候均找不到(编译没有问题)

简介: 作者:jiankunking 出处:http://blog.csdn.net/jiankunking  今天在开发过程中遇到了一个很恶心的问题,就是Form窗体ShowDialog的时候,直接报出下面的错误: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾。 ************** 异常文本 ************** System.MissingMe
+关注继续查看

作者:jiankunking 出处:http://blog.csdn.net/jiankunking 


今天在开发过程中遇到了一个很恶心的问题,就是Form窗体ShowDialog的时候,直接报出下面的错误:

有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.MissingMethodException: 找不到方法:“XXX.XXX.DataObject.SPI.DataObjectColumn[] XXX.XXX.WCFClient.WCFService.ServiceClient.DataColumn_GetListByDOID(System.String)”。
   在 XXX.XXX.Common.CommonHelp.UI.HelpForm.HelpDisplayEditorForm_Load(Object sender, EventArgs e)
   在 System.Windows.Forms.Form.OnLoad(EventArgs e)
   在 System.Windows.Forms.Form.OnCreateControl()
   在 System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   在 System.Windows.Forms.Control.CreateControl()
   在 System.Windows.Forms.Control.WmShowWindow(Message& m)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   在 System.Windows.Forms.Form.WmShowWindow(Message& m)
   在 System.Windows.Forms.Form.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

将断点加在HelpDisplayEditorForm_Load函数上发现,根本进不到函数内部,就报错了。

  个人认为是Form窗体在ShowDialog函数之后,HelpDisplayEditorForm_Load函数之前发生的异常,于是上网搜资料,看微软的源码,也没什么收获。

  于是,咨询了一下同事,同事说把HelpDisplayEditorForm_Load中的所有代码屏蔽掉,看看效果。

我把HelpDisplayEditorForm_Load内所有代码屏蔽到以后,断点可以进入HelpDisplayEditorForm_Load函数内部了,然后,一部分一部分代码的放开,发现,只要到需要调用服务端方法的时候,就会报出面的错误(所有调用WCF服务端方法的地方都会报错)。

 更新过错误提示的dll(通过dll反编译发现错误提示的函数在dll中是存在的),重启过iis等等N过方法之后,还有木有搞定。

由于,是所有WCF服务端方法均不可用,于是回头研究WCF客户端,发现WCF客户端有问题,有人在获取WCF服务端方法的时候,WCF将服务契约标识方法入参中的自定义类型、返回值是自定义类型的,均隐式进行了实体类序列化(此处的序列化指的是,将自定义类型的实体,标识成了WCF数据契约的类型)。

比如SPI中的实体类如下:

using System.Data;

namespace XXXX.XXXX.Common.CommonHelp.SPI
{
    /// <summary>
    /// 智能帮助数据实体类
    /// 对应数据库:[A_CommonHelp]
    /// </summary>
    public class CommonHelpDataEntity
    {
        /// <summary>
        /// HelpEntity 是一个指针 标明该CommonHelpDataEntity属于哪一个CommonHelpEntity
        /// </summary>
        private CommonHelpEntity entity;
        public CommonHelpEntity HelpEntity
        {
            get { return entity; }
        }

        private string displayColumns;
        /// <summary>
        /// 显示字段
        /// </summary>
        public string DisplayColumns
        {
            get { return displayColumns; }
            set { displayColumns = value; }
        }


        private string sourceObject;
        /// <summary>
        /// 源SQL语句
        /// </summary>
        public string SourceObject
        {
            get { return sourceObject; }
            set { sourceObject = value; }
        }

        private string dataTextField;
        /// <summary>
        /// 绑定Text字段
        /// </summary>
        public string DataTextField
        {
            get { return dataTextField; }
            set { dataTextField = value; }
        }

        private string dataValueField;
        /// <summary>
        /// 绑定Value字段
        /// </summary>
        public string DataValueField
        {
            get { return dataValueField; }
            set { dataValueField = value; }
        }

        private string orderFields;

        /// <summary>
        /// 默认排序字段
        /// </summary>
        public string OrderFields
        {
            get { return orderFields; }
            set { orderFields = value; }
        }
        public string rowId;
        /// <summary>
        /// 标志字段
        /// </summary>
        public string RowId
        {
            get { return rowId; }
            set { rowId = value; }
        }

        private string defaultValueCondition;
        /// <summary>
        /// 默认值条件
        /// </summary>
        public string DefaultValueCondition
        {
            get { return defaultValueCondition; }
            set { defaultValueCondition = value; }
        }

        private string category;
        /// <summary>
        /// 帮助类别
        /// </summary>
        public string Category
        {
            get { return category; }
            set { category = value; }
        }

        private string selectDataObjectId;
        /// <summary>
        /// 搜索引擎类型帮助勾选的数据对象的Id
        /// </summary>
        public string SelectDataObjectId
        {
            get { return selectDataObjectId; }
            set { selectDataObjectId = value; }
        }

        private string searchEngineId;
        /// <summary>
        /// 搜索引擎帮助A_SearchEngine ID
        /// </summary>
        public string SearchEngineId
        {
            get { return searchEngineId; }
            set { searchEngineId = value; }
        }

        private string dataModeldId;
        /// <summary>
        /// 数据模型Id
        /// </summary>
        public string DataModeldId
        {
            get { return dataModeldId; }
            set { dataModeldId = value; }
        }

        private string createTime;
        /// <summary>
        /// 帮助创建时间
        /// </summary>
        public string CreateTime
        {
            get { return createTime; }
            set { createTime = value; }
        }
        private string lastUpdateTime;
        /// <summary>
        /// 帮助 最后更新时间
        /// </summary>
        public string LastUpdateTime
        {
            get { return lastUpdateTime; }
            set { lastUpdateTime = value; }
        }

        public CommonHelpDataEntity()
        {
            entity = new CommonHelpEntity();
            entity.SetDataEntity(this);
        }
        public CommonHelpDataEntity(CommonHelpEntity info)
        {
            entity = info;
            entity.SetDataEntity(this);
        }
        public CommonHelpDataEntity(DataRow row)
        {
            entity=new CommonHelpEntity();
            entity.Id = row["Id"].ToString();
            entity.Code = row["Code"].ToString();
            entity.Name = row["Name"].ToString();
            entity.Contains = row["DisplayColumns"].ToString();
            entity.SetDataEntity(this);

            this.DisplayColumns = row["DisplayColumns"].ToString();
            this.SourceObject = row["SourceObject"].ToString();
            this.DataTextField = row["DataTextField"].ToString();
            this.DataValueField = row["DataValueField"].ToString();
            this.OrderFields = row["OrderFields"].ToString();
            this.RowId = row["Id"].ToString();
            //int value=(row["Category"].ToString().Trim().Length==0)?0:int.Parse(row["Category"].ToString());
            //this.Category = Enum.GetName(typeof(HelpTypeEnum), value);
            this.Category = row["Category"].ToString();
            this.SearchEngineId = row["SearchEngineId"].ToString();
            this.SelectDataObjectId = row["SelectDataObjectId"].ToString();
            this.DefaultValueCondition = row["DefaultValueCondition"].ToString();
            this.CreateTime = row["CreateTime"].ToString();
            this.lastUpdateTime = row["lastUpdateTime"].ToString();
            this.dataModeldId = row["DataModeldId"].ToString();
           
        }
        /// <summary>
        /// 关联数据实体
        /// </summary>
        /// <param name="entity"></param>
        public void AssociateHelpEntity(CommonHelpEntity entity)
        {
            entity.SetDataEntity(this);
            this.entity = entity;
        }
    }
}
标识序列化之后的类的为:

 [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="CommonHelpDataEntity", Namespace="http://schemas.datacontract.org/2004/07/XXXX.XXXX.Common.CommonHelp.SPI")]
    [System.SerializableAttribute()]
    public partial class CommonHelpDataEntity : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {
        
        [System.NonSerializedAttribute()]
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string CategoryField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string CreateTimeField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string DataTextFieldField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string DataValueFieldField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string DefaultValueConditionField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string DisplayColumnsField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string LastUpdateTimeField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string OrderFieldsField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string RowIdField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string SearchEngineIdField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string SelectDataObjectIdField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string SourceObjectField;
        
        [System.Runtime.Serialization.OptionalFieldAttribute()]
        private string rowId1Field;
        
        [global::System.ComponentModel.BrowsableAttribute(false)]
        public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
            get {
                return this.extensionDataField;
            }
            set {
                this.extensionDataField = value;
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string Category {
            get {
                return this.CategoryField;
            }
            set {
                if ((object.ReferenceEquals(this.CategoryField, value) != true)) {
                    this.CategoryField = value;
                    this.RaisePropertyChanged("Category");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string CreateTime {
            get {
                return this.CreateTimeField;
            }
            set {
                if ((object.ReferenceEquals(this.CreateTimeField, value) != true)) {
                    this.CreateTimeField = value;
                    this.RaisePropertyChanged("CreateTime");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string DataTextField {
            get {
                return this.DataTextFieldField;
            }
            set {
                if ((object.ReferenceEquals(this.DataTextFieldField, value) != true)) {
                    this.DataTextFieldField = value;
                    this.RaisePropertyChanged("DataTextField");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string DataValueField {
            get {
                return this.DataValueFieldField;
            }
            set {
                if ((object.ReferenceEquals(this.DataValueFieldField, value) != true)) {
                    this.DataValueFieldField = value;
                    this.RaisePropertyChanged("DataValueField");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string DefaultValueCondition {
            get {
                return this.DefaultValueConditionField;
            }
            set {
                if ((object.ReferenceEquals(this.DefaultValueConditionField, value) != true)) {
                    this.DefaultValueConditionField = value;
                    this.RaisePropertyChanged("DefaultValueCondition");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string DisplayColumns {
            get {
                return this.DisplayColumnsField;
            }
            set {
                if ((object.ReferenceEquals(this.DisplayColumnsField, value) != true)) {
                    this.DisplayColumnsField = value;
                    this.RaisePropertyChanged("DisplayColumns");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string LastUpdateTime {
            get {
                return this.LastUpdateTimeField;
            }
            set {
                if ((object.ReferenceEquals(this.LastUpdateTimeField, value) != true)) {
                    this.LastUpdateTimeField = value;
                    this.RaisePropertyChanged("LastUpdateTime");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string OrderFields {
            get {
                return this.OrderFieldsField;
            }
            set {
                if ((object.ReferenceEquals(this.OrderFieldsField, value) != true)) {
                    this.OrderFieldsField = value;
                    this.RaisePropertyChanged("OrderFields");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string RowId {
            get {
                return this.RowIdField;
            }
            set {
                if ((object.ReferenceEquals(this.RowIdField, value) != true)) {
                    this.RowIdField = value;
                    this.RaisePropertyChanged("RowId");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string SearchEngineId {
            get {
                return this.SearchEngineIdField;
            }
            set {
                if ((object.ReferenceEquals(this.SearchEngineIdField, value) != true)) {
                    this.SearchEngineIdField = value;
                    this.RaisePropertyChanged("SearchEngineId");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string SelectDataObjectId {
            get {
                return this.SelectDataObjectIdField;
            }
            set {
                if ((object.ReferenceEquals(this.SelectDataObjectIdField, value) != true)) {
                    this.SelectDataObjectIdField = value;
                    this.RaisePropertyChanged("SelectDataObjectId");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute()]
        public string SourceObject {
            get {
                return this.SourceObjectField;
            }
            set {
                if ((object.ReferenceEquals(this.SourceObjectField, value) != true)) {
                    this.SourceObjectField = value;
                    this.RaisePropertyChanged("SourceObject");
                }
            }
        }
        
        [System.Runtime.Serialization.DataMemberAttribute(Name="rowId")]
        public string rowId1 {
            get {
                return this.rowId1Field;
            }
            set {
                if ((object.ReferenceEquals(this.rowId1Field, value) != true)) {
                    this.rowId1Field = value;
                    this.RaisePropertyChanged("rowId1");
                }
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
该标识序列化之后的类在是Reference.cs文件中找到的。


此处的详细分析,可以参考:点击打开链接

解决方案:

Reference.cs文件所有标识序列化的类、枚举,全部删除,改为引用SPI中的实体类、枚举,然后,重新生成WCFClient,部署,问题搞定。
今天的收获:

1、断点没有进入函数(HelpDisplayEditorForm_Load),并不表示问题,一定在函数之外。

2、数据契约中KnownTypeAttribute属性,在同一个类上标识很多次,如下图:



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WCF 自定义工具错误: 无法生成服务引用“{0}”的代码
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 背景: 今天同一解决方案项目之间添加WCF引用的时候,突然报出了下面的错误 错误信息: 错误 4 自定义工具错误: 无法生成服务引用“TestA”的代码。请检查其他错误和警告信息,了解详细信息。 E:\WorkSpace\DataModelTools\src\Client\Service
1472 0
Winform 调用WCF客户端,所有服务端方法在运行的时候均找不到(编译没有问题)
  今天在开发过程中遇到了一个很恶心的问题,就是Form窗体ShowDialog的时候,直接报出下面的错误: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾。 ************** 异常文本 ************** System.MissingMethodException: 找不到方法:“XXX.XXX.DataObject.SPI.DataObj
794 0
Winform客户端引用WCF客户端后,部分类无法正常使用
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 在项目中用到WCF,项目的结构是这样的: 在SPI项目中编写该解决方案中公共的类及函数; 在WCFService项目中写的是svc文件及WCF服务接口; 在Client中添加WCF服务引用的时候该WCFService项目,然后再UI项目中初始化Client的实例。通过该实例WCFSe
963 0
C# Winform WCF 调试服务端的程序(三种方法)
推荐方法三 作者:jiankunking 出处:http://blog.csdn.net/jiankunking 方法一: 服务端设置: 1、打开需要调试的解决方案,在WCF服务端项目上右键,将其设置为启动项目 2、在该解决方案下点击 或者直接按F5启动WCF服务端项目。 3、寻找端口号: i、方式一 启动调试后,浏览器中会出现下面的界面 需要留意的是地址栏中的端口号。 ii、方式二
3654 0
VS2010创建WebService程序
        选择 .NET 4.0,可以先选择 ASP.NET Empty Web Site/Application 模板,建立空的 Web 网站或项目,在添加新建窗口中,你依然会发现 Web Service 这个项模板。         如下图: 小注:         新建WebService要在解决方案下新建项目!
448 0
WCF服务部署到IIS上,然后通过web服务引用方式出现错误的解决办法
本文转载:http://www.cnblogs.com/shenba/archive/2012/01/06/2313932.html 昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内容,但无法进行处理。
931 0
在silverlight中打开调用外部程序的几种方式
原文 http://www.cnblogs.com/subway-2008/archive/2010/08/15/1799949.html 在silverlight中调用外部程序的几种方法总结如下: 1.silverlight不支持oob模式的时候,silverlight调外部应用程序只能通过activex来实现。
675 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
小程序 大世界
立即下载
15分钟打造你自己的小程序
立即下载
《15分钟打造你自己的小程序》
立即下载