我有一个带有客户端应用程序的WCF服务。我完全控制了客户端和服务器的实现。我在WCF合同中有数百个方法,需要客户提供的一条信息。有没有一种方法,我可以通过每次调用服务从客户端发送特定数据,可能是在频道的某个地方?
也许当客户端在进行调用之前设置代理时,它可以将这些数据存储在代理的内部属性中...然后数据将被发送到服务器并从服务方法中我可以检查OperationContext或其他一些内存来获取这些数据并使用它?
有什么想法吗?
答案 0 :(得分:1)
听起来你想要像SOAP webservices这样的标题。我不是WCF专家,而是looks like the WCF equivalent。
答案 1 :(得分:1)
实际上应该不那么难。我能想到的最好的方法是编写一个IClientMessageInspector,在其BeforeSendRequest方法中将Message头添加到Message.Headers中。
参见例如http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx
答案 2 :(得分:0)
你无法做到这一点。这需要一些工作。
SOAP Headers确实是将带外数据传递到服务和/或从服务传递的完美方式。但是您已经定义了合同,添加标题将改变合同。
我相信你必须开始使用邮件合同。
原件:
[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" } };
}
}