none
生存客户端调用代码不一样,使用工具SvcUtil.exe 与 VS中"添加服务引用",导致调用服务失败 RRS feed

  • 问题

  • 服务搭建成功,可以正常运行

    1、然后使用SvcUtil.exe生存客户端调用代码,调用服务器失败,无法进入服务端的方法中,我断点调试来。

    2、使用VS中"添加服务引用"就可以正常调用到服务端的方法,断点也进去了。

    经过分析,发现使用SvcUtil与添加服务引用    生存的代码不一样,不知道为什么。

    跟下面这位朋友的一样

    https://social.msdn.microsoft.com/Forums/zh-CN/54c79232-9dc3-45fa-baf3-be04cd1f3a79/wcf-?forum=wcfzhchs

    不知道是我不会用SvcUtil工具?还是vs的bug呀?

    2015年11月19日 6:33

答案

  • 你好,

    能给个详细的错误信息么?

    我简单的测试了一下, 我用SvcUtil.exe 生成代理类和配置文件后,能够在客户端正常调用。

    在用SvcUtil.exe 工具的时候,你有没有把output.config 文件重命名成 App.config.

    其次通过添加服务引用生成的代码和使用SvcUtil.exe 确实会有一些不同。

     

    • 已标记为答案 server 126 2015年11月23日 5:59
    2015年11月20日 2:53
    版主

全部回复

  • 你好,

    能给个详细的错误信息么?

    我简单的测试了一下, 我用SvcUtil.exe 生成代理类和配置文件后,能够在客户端正常调用。

    在用SvcUtil.exe 工具的时候,你有没有把output.config 文件重命名成 App.config.

    其次通过添加服务引用生成的代码和使用SvcUtil.exe 确实会有一些不同。

     

    • 已标记为答案 server 126 2015年11月23日 5:59
    2015年11月20日 2:53
    版主
  • 您好,非常感谢您的热心回答,

    您可以自定义一个request实体类,比如:

     [DataContract(Name = "DbRequest")]
        public sealed class DbRequest
        {
            [DataMember(Name = "Name", Order = 1)]
            public string Name { get; set; }
    
            [DataMember(Name = "SDType", Order = 2)]
            public SqlDbType SDType { get; set; }  //System.Data.SqlDbType命名空间下的枚举
        }
    
        [ServiceContract(Name = "IService")]
        public interface IService
        {
            [OperationContract(Name = "GetData")]
            string GetData(DbRequest info);
        }
    
        [ServiceBehavior(Name = "DbService", ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
        public class Service : IService
        {
    
            #region IService 成员
    
            public string GetData(DbRequest info)
            {
                //do something
                return info.Name;
            }
    
            #endregion
        }

    使用SvcUtil.exe手动生成代码如下:(不正确的,它重新创建了SqlDbType枚举,而是没有使用System.Data.SqlDbType的)

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     此代码由工具生成。
    //     运行时版本:4.0.30319.34011
    //
    //     对此文件的更改可能会导致不正确的行为,并且如果
    //     重新生成代码,这些更改将会丢失。
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace SystemService.Library
    {
        using System.Runtime.Serialization;
        
        
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
        [System.Runtime.Serialization.DataContractAttribute(Name="DbRequest", Namespace="http://schemas.datacontract.org/2004/07/SystemService.Library")]
        public partial class DbRequest : object, System.Runtime.Serialization.IExtensibleDataObject
        {
            
            private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
            
            private string NameField;
            
            private System.Data.SqlDbType SDTypeField;
            
            public System.Runtime.Serialization.ExtensionDataObject ExtensionData
            {
                get
                {
                    return this.extensionDataField;
                }
                set
                {
                    this.extensionDataField = value;
                }
            }
            
            [System.Runtime.Serialization.DataMemberAttribute()]
            public string Name
            {
                get
                {
                    return this.NameField;
                }
                set
                {
                    this.NameField = value;
                }
            }
            
            [System.Runtime.Serialization.DataMemberAttribute()]
            public System.Data.SqlDbType SDType
            {
                get
                {
                    return this.SDTypeField;
                }
                set
                {
                    this.SDTypeField = value;
                }
            }
        }
    }
    namespace System.Data
    {
        using System.Runtime.Serialization;
        
        
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
        [System.Runtime.Serialization.DataContractAttribute(Name="SqlDbType", Namespace="http://schemas.datacontract.org/2004/07/System.Data")]
        public enum SqlDbType : int
        {
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            BigInt = 0,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Binary = 1,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Bit = 2,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Char = 3,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            DateTime = 4,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Decimal = 5,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Float = 6,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Image = 7,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Int = 8,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Money = 9,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            NChar = 10,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            NText = 11,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            NVarChar = 12,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Real = 13,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            UniqueIdentifier = 14,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            SmallDateTime = 15,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            SmallInt = 16,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            SmallMoney = 17,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Text = 18,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Timestamp = 19,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            TinyInt = 20,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            VarBinary = 21,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            VarChar = 22,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Variant = 23,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Xml = 25,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Udt = 29,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Structured = 30,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Date = 31,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            Time = 32,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            DateTime2 = 33,
            
            [System.Runtime.Serialization.EnumMemberAttribute()]
            DateTimeOffset = 34,
        }
    }
    
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="IService")]
    public interface IService
    {
        
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService/GetData", ReplyAction="http://tempuri.org/IService/GetDataResponse")]
        string GetData(SystemService.Library.DbRequest info);
        
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService/GetData", ReplyAction="http://tempuri.org/IService/GetDataResponse")]
        System.Threading.Tasks.Task<string> GetDataAsync(SystemService.Library.DbRequest info);
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface IServiceChannel : IService, System.ServiceModel.IClientChannel
    {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class ServiceClient : System.ServiceModel.ClientBase<IService>, IService
    {
        
        public ServiceClient()
        {
        }
        
        public ServiceClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }
        
        public ServiceClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public ServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public ServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }
        
        public string GetData(SystemService.Library.DbRequest info)
        {
            return base.Channel.GetData(info);
        }
        
        public System.Threading.Tasks.Task<string> GetDataAsync(SystemService.Library.DbRequest info)
        {
            return base.Channel.GetDataAsync(info);
        }
    }

    而是用VS--右键--添加服务引用,就是使用的System.Data.SqlDbType枚举   :如下(太多了,我就不全部贴上来了)

    Reference.cs文件

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     此代码由工具生成。
    //     运行时版本:4.0.30319.34011
    //
    //     对此文件的更改可能会导致不正确的行为,并且如果
    //     重新生成代码,这些更改将会丢失。
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace ConsoleApplication2.ServiceReference1 {
        
        
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
        [System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.IService")]
        public interface IService {
            
            [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService/GetData", ReplyAction="http://tempuri.org/IService/GetDataResponse")]
            string GetData(SystemService.Library.DbRequest info);
        }
        
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
        public interface IServiceChannel : ConsoleApplication2.ServiceReference1.IService, System.ServiceModel.IClientChannel {
        }
        
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
        public partial class ServiceClient : System.ServiceModel.ClientBase<ConsoleApplication2.ServiceReference1.IService>, ConsoleApplication2.ServiceReference1.IService {
            
            public ServiceClient() {
            }
            
            public ServiceClient(string endpointConfigurationName) : 
                    base(endpointConfigurationName) {
            }
            
            public ServiceClient(string endpointConfigurationName, string remoteAddress) : 
                    base(endpointConfigurationName, remoteAddress) {
            }
            
            public ServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                    base(endpointConfigurationName, remoteAddress) {
            }
            
            public ServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                    base(binding, remoteAddress) {
            }
            
            public string GetData(SystemService.Library.DbRequest info) {
                return base.Channel.GetData(info);
            }
        }
    }
    


    不知道是我不会用SvcUtil工具?还是vs的bug呀?


    • 已编辑 server 126 2015年11月23日 5:55 代码写错了
    2015年11月23日 5:52
  • 非常感谢版主,问题我已经找到了,谢谢您。
    2015年11月23日 6:00
  • 您好,

    能分享一下您的解决方案么?

    非常感谢。

    2015年11月23日 6:02
    版主
  • 您好,

    解决办法:是Svcutil.exe 引用所需要的类库即可以。

    2015年11月23日 8:51
  • 您好,

    感谢您的分享和支持:)

    Best Regards,

    Grady

    2015年11月23日 8:54
    版主