Web Services WCF -将数据发送到合同外的服务器

mnowg1ta  于 2023-01-17  发布在  其他
关注(0)|答案(3)|浏览(138)

我有一个带客户端应用程序的WCF服务。我对客户端和服务器实现都有完全的控制权。我在WCF协定中有数百个方法,这些方法需要客户端提供的一条信息。有没有一种方法可以在每次调用服务时从客户端发送特定的数据,而不是修改数百个方法,可能是在通道中的某个位置?
也许当客户端在进行调用之前设置代理时,它可以将此数据存储在代理的内部属性中的某个地方...然后,数据将被发送到服务器,我可以从服务方法中检查OperationContext或其他内存块,以获取此数据并使用它?
有什么想法吗?

btxsgosb

btxsgosb1#

这听起来像你想要的东西像SOAP的Web服务的头部。我不是一个WCFMaven,但这个looks like the WCF equivalent

0lvr5msh

0lvr5msh2#

实际上这并不难,我能想到的最好方法是编写一个IClientMessageInspector,它在其BeforeSendRequest方法中将SOAP头添加到Message.Headers中。
参见例如http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

flvtvl50

flvtvl503#

你不能把这件事做得这么简单。这需要花些功夫。
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" } };
    }
}

相关问题