WebOperationContext.Current.OutOngonResponse.Header停止使用自定义IDISPATCHMESSAGEFORMATERTARTE

发布于 2025-02-04 00:40:40 字数 3079 浏览 2 评论 0 原文

我有自定义 idisPatchMessageFormatter 注册

        public class JsonOperationBehavior : IOperationBehavior
        {
            public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
            {

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

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

            }
        }

        public class JsonFormatter : IDispatchMessageFormatter
        {
            readonly OperationDescription _operationDescription;
            readonly IDispatchMessageFormatter _originalFormatter;

            public JsonFormatter(OperationDescription operationDescription, IDispatchMessageFormatter originalFormatter)
            {
                _operationDescription = operationDescription;
                _originalFormatter = originalFormatter;
            }


            public void DeserializeRequest(Message message, object[] parameters)
            {
                parameters[0] = JsonHelper.DeserializeObject(GetRequestType(), WebServiceHelper.GetRequestRawStringBody(message));
            }

            public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
            {
                var json = JsonHelper.SerializeObject(GetResponseType(), result);
                var bytes = Encoding.UTF8.GetBytes(json);
                var replyMessage = Message.CreateMessage(messageVersion, GetResponseAction(), new RawDataWriter(bytes));
                replyMessage.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));

                return replyMessage;
            }


            private Type GetRequestType()
            {
                return _operationDescription.Messages[0].Body.Parts.Last().Type;
            }

            private Type GetResponseType()
            {
                return (_operationDescription.SyncMethod ?? _operationDescription.EndMethod).ReturnType;
            }

            private string GetResponseAction()
            {
                return _operationDescription.Messages[1].Action;
            }
        }

每个事物看起来都正确,但我指出,在

            WebOperationContext.Current.OutgoingResponse.Headers.Add(name, value);

停止工作之前工作的其他地方,没有显示新的标题。

但是随后,我将代码添加在 serializereply 中,例如:

_ = _originalFormatter.SerializeReply(messageVersion, parameters, result);

即使我不使用此功能的结果,标题也会再次工作。

I have custom IDispatchMessageFormatter registration

        public class JsonOperationBehavior : IOperationBehavior
        {
            public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
            {

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

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

            }
        }

        public class JsonFormatter : IDispatchMessageFormatter
        {
            readonly OperationDescription _operationDescription;
            readonly IDispatchMessageFormatter _originalFormatter;

            public JsonFormatter(OperationDescription operationDescription, IDispatchMessageFormatter originalFormatter)
            {
                _operationDescription = operationDescription;
                _originalFormatter = originalFormatter;
            }


            public void DeserializeRequest(Message message, object[] parameters)
            {
                parameters[0] = JsonHelper.DeserializeObject(GetRequestType(), WebServiceHelper.GetRequestRawStringBody(message));
            }

            public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
            {
                var json = JsonHelper.SerializeObject(GetResponseType(), result);
                var bytes = Encoding.UTF8.GetBytes(json);
                var replyMessage = Message.CreateMessage(messageVersion, GetResponseAction(), new RawDataWriter(bytes));
                replyMessage.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));

                return replyMessage;
            }


            private Type GetRequestType()
            {
                return _operationDescription.Messages[0].Body.Parts.Last().Type;
            }

            private Type GetResponseType()
            {
                return (_operationDescription.SyncMethod ?? _operationDescription.EndMethod).ReturnType;
            }

            private string GetResponseAction()
            {
                return _operationDescription.Messages[1].Action;
            }
        }

Every thing look like its work correctly but I noted that somewhere else that work before

            WebOperationContext.Current.OutgoingResponse.Headers.Add(name, value);

Stop working and new headers are not show in response.

but then I add code in SerializeReply like:

_ = _originalFormatter.SerializeReply(messageVersion, parameters, result);

Then headers start working again even if I do not use result of this function.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灰色世界里的红玫瑰 2025-02-11 00:40:40

在查看了WCF的源代码之后:

nnnb1 refence n N.NN N N.NN N.N N.N.NN N.N.NN NN) https://referencesource.microsoft.com/#servicemodel.web/system/servicemodel/dispatcher/multiplexiplexipingdispatchmessageformatter.cs,43219486eb5aa.b5aa.8b1 references /

全部归结为:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";

WebOperationContext.Current.OutOnginResponse.headers 需要正确的工作。

After looking source code of WCF:

https://referencesource.microsoft.com/#System.ServiceModel.Web/System/ServiceModel/Dispatcher/MultiplexingDispatchMessageFormatter.cs,43219486eb5aa8b1,references

I look that default SerializeReply change global state ;/

All boil down to:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";

Is required for WebOperationContext.Current.OutgoingResponse.Headers work correctly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文