WCF - 将数据发送到合同外的服务器
问题描述:
我有一个客户端应用程序的WCF服务。我完全控制客户端和服务器实现。我在WCF合约中有数百种方法需要客户端提供的信息。我可以通过每次调用服务的方式发送客户端的特定数据,而不是修改数百种方法,而不是通道中的某个地方?WCF - 将数据发送到合同外的服务器
也许当客户端在调用之前设置代理时,它可以将此数据存储在代理的内部属性中的某处...然后将数据发送到服务器,并从服务方法I可以检查OperationContext或其他一些内存来获取这些数据并使用它?
任何想法?
答
你不能这么做。这将需要一些工作。
确实,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