2009-10-14 96 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" } }; 
    } 
}