WCF:具有不同内容类型的请求/响应

Posted

技术标签:

【中文标题】WCF:具有不同内容类型的请求/响应【英文标题】:WCF: request/response with different content types 【发布时间】:2021-12-04 17:47:50 【问题描述】:

我正在尝试使用 .NET 5 中的 WCF 使用 SOAP 服务。服务提供者希望请求的内容类型为 text/xml,但发送内容类型为 application/xml 的响应。

以下代码抛出 ProtocolException,因为它期望请求和响应都具有内容类型 text/xml

var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress("http://[...]/inquiry");
var channelFactory = new ChannelFactory<InquiryServiceSoapPort>(binding, endpoint);
var serviceClient = channelFactory.CreateChannel();
var inquiry = new Inquiry();
var result = serviceClient.createInquiry(inquiry);

我能够使用custom encoder 将内容类型更改为application/xml,但这会同时更改请求和响应,然后我的请求被服务器拒绝。

有没有办法只改变响应的内容类型?

编辑

请注意,我正在编写客户端代码,而不是服务器端代码。到目前为止,我似乎只能捕获并吞下异常,或者使用另一个框架或从头开始重新实现代码。

【问题讨论】:

“我正在尝试使用 .NET 5 中的 WCF 使用 SOAP 服务” - 你有我的同情 出于好奇,您是否使用(非常不符合人体工程学的)旧的 .NET WCF 客户端代码?如果这仅适用于少数 SOAP 端点,您可以使用您自己的逻辑对 HttpClient 进行破解。 你可以看看this case,也许对你有帮助。 【参考方案1】:

在此处查看 WCF 架构: https://docs.microsoft.com/en-us/dotnet/framework/wcf/architecture

所以我们有 WCF 的 ABC 是 Address、Binding 和 Contract,这里我们在合约序列化中 https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-transfer-and-serialization

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-serializer

详细说明: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.datacontractserializer?view=net-5.0

这是我建议深入研究的概念,http 标头类型“content-type”实际上是其余部分的函数,以防您进行 BasicHttp 绑定 https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.basichttpbinding?view=dotnet-plat-ext-5.0

这只是 WCF 中可用的更大工具的一角。例如 wsHttpBinding 在许多情况下确实更可取,如果端点可用,它可以单独解决您的问题。

在wsHttpBinding中可以控制消息编码 https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/wshttpbinding

最终选择您的消息编码器将决定如何设置标头,与 REST io 模型相比,有很多抽象级别,但它就在那里: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/choosing-a-message-encoder

你甚至可以滚动你自己的。

【讨论】:

以上是关于WCF:具有不同内容类型的请求/响应的主要内容,如果未能解决你的问题,请参考以下文章

响应消息的内容类型application/xml;charset=utf-8 与绑定的内容类型(text/xml;charset=utf-8)不匹配,WCF

在 WCF Azure 服务总线中动态分配 json 响应内容类型

WCF - (504) 服务器没有为此请求返回响应

应用程序/json内容类型请求的Restful WCF POST问题

如何在java中发送具有不同内容类型的mime multipart restful请求

WCF SOAP 服务忽略内容类型字符集