2009-10-14 44 views
2

我有一个客户端应用程序的WCF服务。我完全控制客户端和服务器实现。我在WCF合约中有数百种方法需要客户端提供的信息。我可以通过每次调用服务的方式发送客户端的特定数据,而不是修改数百种方法,而不是通道中的某个地方?WCF - 将数据发送到合同外的服务器

也许当客户端在调用之前设置代理时,它可以将此数据存储在代理的内部属性中的某处...然后将数据发送到服务器,并从服务方法I可以检查OperationContext或其他一些内存来获取这些数据并使用它?

任何想法?

回答

0

你不能这么做。这将需要一些工作。

确实,SOAP标题是将数据传递到服务和/或从服务传递带外数据的完美方式。但是您已经定义了您的合同,添加标题将会更改合同。我相信你将不得不开始使用消息合约。

原文:

[DataContract] 
public class ComplexObject 
{ 
    [DataMember(Name = "Id")] 
    public int Id; 

    [DataMember] 
    public string Name; 
} 

[ServiceContract()] 
public interface IMyContract 
{ 
    void MyOperation(ComplexObject co); 
} 

public class MyService : IMyContract 
{ 
    #region Implementation of IMyContract 

    public void MyOperation(ComplexObject co) 
    { 
     // use co.* 
    } 

    #endregion 
} 

使用消息合同:

[DataContract] 
public class ComplexObject 
{ 
    [DataMember(Name = "Id")] 
    public int Id; 

    [DataMember] 
    public string Name; 
} 

[DataContract] 
public class MyHeader 
{ 
    [DataMember] 
    public string UserName; 

    [DataMember] 
    public string Password; 
} 

[DataContract] 
public class OutputHeader 
{ 
    [DataMember] 
    public string Token; 
} 

[MessageContract] 
public class MyOperationRequest 
{ 
    [MessageHeader] 
    public MyHeader Authentication; 

    [MessageBodyMember] 
    public ComplexObject TheObject; 
} 

[MessageContract] 
public class MyOperationResponse 
{ 
    [MessageHeader] 
    public OutputHeader OutputHeader; 
} 

[ServiceContract()] 
public interface IMyContract 
{ 
    MyOperationResponse MyOperation(MyOperationRequest request); 
} 

public class MyService : IMyContract 
{ 
    public MyOperationResponse MyOperation(MyOperationRequest request) 
    { 
     // use request.TheObject.* 
     // Can also read request.Authentication.* 

     return new MyOperationResponse 
       { OutputHeader = new OutputHeader { Token = "someToken" } }; 
    } 
}