WCF - 在合同之外向服务器发送数据

时间:2009-10-14 17:52:42

标签: wcf web-services

我有一个带有客户端应用程序的WCF服务。我完全控制了客户端和服务器的实现。我在WCF合同中有数百个方法,需要客户提供的一条信息。有没有一种方法,我可以通过每次调用服务从客户端发送特定数据,可能是在频道的某个地方?

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

有什么想法吗?

3 个答案:

答案 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" } };
    }
}