C# 方法签名在添加WCF服务后更改

C# 方法签名在添加WCF服务后更改,c#,wcf,service-reference,C#,Wcf,Service Reference,在我的解决方案中,我创建了一个WCF服务,该服务将消息协定类作为参数 [ServiceContract] public interface IServiceClass { [OperationContract] Employee AddEmployee(Employee employee); } public class ServiceClass : IServiceClass { public Employee AddEmployee(Employee empl

在我的解决方案中,我创建了一个WCF服务,该服务将消息协定类作为参数

[ServiceContract]
public interface IServiceClass
{
    [OperationContract]
    Employee AddEmployee(Employee employee);

}

 public class ServiceClass : IServiceClass
 {
    public Employee AddEmployee(Employee employee)
    {
       //do something
    }
 }

[MessageContract]
public class Employee
{
    [MessageHeader]
    public string EmployeeNumber { get; set; }

    [MessageBodyMember]
    public string FirstName { get; set; }
    [MessageBodyMember]
    public string LastName { get; set; }
    [MessageBodyMember]
    public DateTime DOB { get; set; }
}
然后,我使用添加服务引用选项将此服务添加到客户端应用程序中。已成功添加服务。 然后在我的客户端程序中,我使用了这种方法。但方法签名已更改。它的变化如下

 public void AddEmployee(ref string EmployeeNumber, 
    ref System.DateTime DOB, ref string FirstName, ref string LastName)
TcpServiceReference.ServiceClassClient service =
            new TcpServiceReference.ServiceClassClient();
我在客户端使用的服务如下

 public void AddEmployee(ref string EmployeeNumber, 
    ref System.DateTime DOB, ref string FirstName, ref string LastName)
TcpServiceReference.ServiceClassClient service =
            new TcpServiceReference.ServiceClassClient();
注意:TcpServiceReference是服务名称


我不明白原因。

问题解决了吗

看起来代理没有成功生成,除非您还有一个AddEmployee方法返回void(并接受四个参数)

我建议您重新生成(删除并创建)服务引用

干杯
--Jocke你解决问题了吗

看起来代理没有成功生成,除非您还有一个AddEmployee方法返回void(并接受四个参数)

我建议您重新生成(删除并创建)服务引用

干杯
--Jocke

不太清楚为什么WCF有时会这样做,但如果您使用服务接口,您将获得“正确”的方法签名:

TcpServiceReference.IServiceClass service = 
    new TcpServiceReference.ServiceClassClient();

(假设
IServiceClass
是svcutil(添加服务引用)为您生成的服务接口的客户端名称。)

不清楚WCF为什么有时会这样做,但如果使用服务接口,您将获得“正确”的方法签名:

TcpServiceReference.IServiceClass service = 
    new TcpServiceReference.ServiceClassClient();

(假设
IServiceClass
是svcutil(添加服务引用)为您生成的服务接口的客户端名称。)

您确定IDE提取的客户端代码中不存在签名吗?尝试搜索它,看看是否找到另一个实例。Belogix:我在Reference.cs类中查找了方法accept the Employee类在servicerence.TcpServiceReference.IServiceClass中,但它不在servicerence.TcpServiceReference.serviceclassclient中您确定客户端代码中的其他地方不存在签名吗IDE正在接收的数据?尝试搜索它,看看是否找到另一个实例。Belogix:我在Reference.cs类中查找了方法accept Employee类在servicerence.TcpServiceReference.IServiceClass中,但它不在servicerence.TcpServiceReference.serviceclassclient中。但是您有两个具有不同签名的AddEmployee方法吗?一个返回void,一个返回Employee?但是你们有两个不同签名的AddEmployee方法吗?一个是退回作废的,一个是退回员工的?这对我很有用。但是我不明白为什么会发生这种情况。如果我添加一个没有参数的方法,它会正确地显示在TcpServiceReference.ServiceClassClient中。是的,我也不确定。我从来没有在使用自己的WCF服务时发生过这种情况,只有在访问PayPal服务时才会发生。我想这取决于服务公开的WSDL中的某些内容。也许SOAP版本(绑定)会产生影响?我可以将Employee的行为复制为MessageContract,但在使用DataContract时不会。有什么不同吗?@Jocke啊,可能是这样,我以前从未使用过MessageContracts。它们显然让你更直接地控制SOAP消息。这对我来说很有用。但是我不明白为什么会发生这种情况。如果我添加一个没有参数的方法,它会正确地显示在TcpServiceReference.ServiceClassClient中。是的,我也不确定。我从来没有在使用自己的WCF服务时发生过这种情况,只有在访问PayPal服务时才会发生。我想这取决于服务公开的WSDL中的某些内容。也许SOAP版本(绑定)会产生影响?我可以将Employee的行为复制为MessageContract,但在使用DataContract时不会。有什么不同吗?@Jocke啊,可能是这样,我以前从未使用过MessageContracts。它们显然让您能够更直接地控制SOAP消息。