我有一個客戶端應用程序的WCF服務。我完全控制客戶端和服務器實現。我在WCF合約中有數百種方法需要客戶端提供的信息。我可以通過每次調用服務的方式發送客戶端的特定數據,而不是修改數百種方法,而不是通道中的某個地方?WCF - 將數據發送到合同外的服務器
也許當客戶端在調用之前設置代理時,它可以將此數據存儲在代理的內部屬性中的某處...然後將數據發送到服務器,並從服務方法I可以檢查OperationContext或其他一些內存來獲取這些數據並使用它?
任何想法?
我有一個客戶端應用程序的WCF服務。我完全控制客戶端和服務器實現。我在WCF合約中有數百種方法需要客戶端提供的信息。我可以通過每次調用服務的方式發送客戶端的特定數據,而不是修改數百種方法,而不是通道中的某個地方?WCF - 將數據發送到合同外的服務器
也許當客戶端在調用之前設置代理時,它可以將此數據存儲在代理的內部屬性中的某處...然後將數據發送到服務器,並從服務方法I可以檢查OperationContext或其他一些內存來獲取這些數據並使用它?
任何想法?
這聽起來像你想像SOAP Web服務一樣的標題。我不是WCF專家,但是這個looks like the WCF equivalent。
你不能這麼做。這將需要一些工作。
確實,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" } };
}
}
它不應該實際上是很難。我能想到的最好方法是編寫一個IClientMessageInspector,它在其BeforeSendRequest方法中的Message.Headers中添加一個SOAP頭。
參見例如http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx