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

问题
-
服务搭建成功,可以正常运行
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呀?
答案
-
你好,
能给个详细的错误信息么?
我简单的测试了一下, 我用SvcUtil.exe 生成代理类和配置文件后,能够在客户端正常调用。
在用SvcUtil.exe 工具的时候,你有没有把output.config 文件重命名成 App.config.
其次通过添加服务引用生成的代码和使用SvcUtil.exe 确实会有一些不同。
- 已标记为答案 server 126 2015年11月23日 5:59
全部回复
-
你好,
能给个详细的错误信息么?
我简单的测试了一下, 我用SvcUtil.exe 生成代理类和配置文件后,能够在客户端正常调用。
在用SvcUtil.exe 工具的时候,你有没有把output.config 文件重命名成 App.config.
其次通过添加服务引用生成的代码和使用SvcUtil.exe 确实会有一些不同。
- 已标记为答案 server 126 2015年11月23日 5:59
-
您好,非常感谢您的热心回答,
您可以自定义一个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 代码写错了