且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

启用 IDispatchMessageFormatter 后,我在服务中看到可为空的参数

更新时间:2023-10-14 23:10:16

当我们实现 IDispatchMessageFormatter 接口时,通常我们并不认为 DeserializeRequest 方法很重要,因为它不返回任何数据.这是一种误导,因为方法需要做一些事情.

When we are implementing IDispatchMessageFormatter interface usually we are not thinking that method DeserializeRequest is something important as it is not returning any data. This is misleading as method needs to do something.

使参数正确传递的最简单方法是使用基本的DispatchMessageFormatter.将其添加到构造函数中.

The easiest way to make parameters correctly passed is to use base DispatchMessageFormatter. Add it to the constructor.

public class ResponseJsonFormatter : IDispatchMessageFormatter
{
    IDispatchMessageFormatter basicDispatchMessageFormatter;
    OperationDescription Operation;
    public ResponseJsonFormatter(OperationDescription operation, IDispatchMessageFormatter inner)
    {
        this.Operation = operation;
        this.basicDispatchMessageFormatter = inner;
    }

    public void DeserializeRequest(Message message, object[] parameters)
    {
        basicDispatchMessageFormatter.DeserializeRequest(message, parameters);
    }

    public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
    {
        string json=Newtonsoft.Json.JsonConvert.SerializeObject(result);
        byte[] bytes = Encoding.UTF8.GetBytes(json);
        Message replyMessage = Message.CreateMessage(messageVersion, Operation.Messages[1].Action, new RawDataWriter(bytes));
        replyMessage.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));
        return replyMessage;
    }
}

并在行为中启动它:

public class ClientJsonDateFormatterBehavior : IOperationBehavior
{
    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
    {
        // throw new NotImplementedException();
    }

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {
    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.Formatter = new ResponseJsonFormatter(operationDescription, dispatchOperation.Formatter);
    }

    public void Validate(OperationDescription operationDescription)
    {
        // throw new NotImplementedException();
    }
}

您可以在 github 分支 DateTimeFormatterWithParams 中查看工作示例